我有下面的Pandas数据框:
| 组ID|日期|价值|
| - ------|- ------|- ------|
| 1个|2023年1月1日|A类|
| 1个|2023年1月5日|B|
| 1个|2023年1月17日|C级|
| 第二章|2023年1月1日|A类|
| 第二章|2023年1月20日|B|
| 三个|2023年1月1日|A类|
| 三个|2023年1月10日|B|
| 三个|2023年1月12日|C级|
我想执行groupby并计算每个groupId
的唯一值的数量,但只查看最后n=14天,相对于该行的date
。
我想要的结果是这样的:
| 组ID|日期|价值|新列|
| - ------|- ------|- ------|- ------|
| 1个|2023年1月1日|A类|1个|
| 1个|2023年1月5日|B|第二章|
| 1个|2023年1月17日|C级|第二章|
| 第二章|2023年1月1日|A类|1个|
| 第二章|2023年1月20日|B|1个|
| 三个|2023年1月1日|A类|1个|
| 三个|2023年1月10日|B|第二章|
| 三个|2023年1月12日|C级|三个|
我确实尝试过使用groupby(...).rolling('14d').nunique()
,虽然rolling
函数适用于数字字段来计数和计算平均值等...但当与nunique
一起用于字符串字段来计数唯一字符串/对象值的数量时,它就不起作用了。
您可以使用下面的代码生成 Dataframe 。
pd.DataFrame(
{
'groupId': [1, 1, 1, 2, 2, 3, 3, 3],
'date': ['2023-01-01', '2023-01-05', '2023-01-17', '2023-01-01', '2023-01-20', '2023-01-01', '2023-01-10', '2023-01-12'], #YYYY-MM-DD
'value': ['A', 'B', 'C', 'A', 'B', 'A', 'B', 'C'],
'newColumn': [1, 2, 2, 1, 1, 1, 2, 3]
}
)
你知道如何解决这个问题吗,即使不使用rolling
函数?非常感谢!
2条答案
按热度按时间igetnqfo1#
您也可以使用
count
代替nunique
:如果您的索引是数值型的(或者创建一个单调递增的虚拟列),您可以使用以下技巧:
您可以使用
pd.factorize
将value
列转换为数值列:ecfsfe2w2#
另一种可能的解决方案(不使用
rolling
):输出: