python - 使用时间滚动计数熊猫分类变量
问题描述
我有一个看起来像这样的数据框:
Datetime | Category | ID
--------------------------
2020-01-30 | A | 1
2020-02-01 | B | 1
2020-02-02 | A | 1
2020-02-20 | A | 1
2020-01-28 | B | 2
2020-01-29 | C | 2
2020-01-30 | C | 2
2020-01-31 | D | 2
2020-02-01 | D | 2
2020-02-02 | D | 2
2020-02-03 | C | 2
我想在该行的 1 周窗口内获取每个 ID 的前 2 个最常见的类别(不包括当前行)。熊猫有可能吗?我试图做 .rolling 和 .value_counts 但它似乎不起作用。谢谢!
下面是我想得到的数据框:
Datetime | Category | ID
--------------------------
2020-01-30 | NaN | 1
2020-02-01 | [A, ""] | 1
2020-02-02 | [A, B] | 1
2020-02-20 | NaN | 1
2020-01-28 | Nan | 2
2020-01-29 | [B,""] | 2
2020-01-30 | [B,C] | 2
2020-01-31 | [B,C] | 2
2020-02-01 | [C,D] | 2
2020-02-02 | [C,D] | 2
2020-02-03 | [C,D] | 2
谢谢!
编辑 pd.get_dummies 答案很好,但由于我的数据集很大,它效率不高。如果有人对此有有效的解决方案,将不胜感激!谢谢!
解决方案
您可以使用resample()
而不是rolling()
,因为您的时间索引频率是每天,并且您想要每周统计信息,所以请尝试以下操作:
df.groupby('ID').resample('1w').apply(lambda s: s.value_counts().head(2))
请注意,这仅适用于apply()
将数据剥离为的 Pandas 版本pd.Series
,而不是np.arrays
. 此外,如果您的数据框中有更多列,则可能需要在 lambda 函数中指定列名,即:
df.groupby('ID').resample('1w').apply(lambda s: s['Category'].value_counts().head(2))
如果您需要排除窗口中的第一行,请使用iloc[]
切片:
df.groupby('ID').resample('1w').apply(lambda s: s['Category'].iloc[1:].value_counts().head(2))
推荐阅读
- php - 如何正确使用 WC_Order 类?
- eloquent - Eloquent:如何从集合中获取与指定集合中所有项目相关的值?
- php - laravel如何四舍五入到小数点
- webpack - @Types 没有使用正确的模块(Typescript、http-proxy-middleware、webpack、react)
- botframework - How can I create a custom screen in the messaging section in Microsoft Teams add-on
- android - NotSerializableException: kotlin.UNINITIALIZED_VALUE 设置 minifyEnabled 后为 true
- teradata-sql-assistant - Teradata 存储过程结果输出
- python-3.x - 使用文件和工作表名称中的动态日期在python中读取excel文件
- javascript - Javascript for 循环中嵌套 if 语句的正确语法
- vba - 如何限制标准模块中的功能范围