我有一个pandas数据框,里面有id,number和date。我想创建一个新的列,显示有多少日期低于当前ID的日期相同的数字(按数字分组)。
import pandas as pd
df = pd.DataFrame({'id': [1,2,3,4,5,6],'number':['a', 'a', 'a', 'a', 'b', 'c'], 'date' : ['2023-06-20', '2022-06-20', '2021-06-20', '2021-07-20', '2022-06-20', '2023-06-20']})
print(df)
id number date
0 1 a 2023-06-20
1 2 a 2022-06-20
2 3 a 2021-06-20
3 4 a 2021-07-20
4 5 b 2022-06-20
5 6 c 2023-06-20
我使用了pandas apply函数进行过滤。问题是我有300k+行,在代码下面运行大约需要2个小时。如何优化它?
df['result'] = df.apply(lambda x:len(df[(df['number'] == x['number']) & (df['date'] < x['date'])]), axis = 1)
print(df)
id number date result
0 1 a 2023-06-20 3
1 2 a 2022-06-20 2
2 3 a 2021-06-20 0
3 4 a 2021-07-20 1
4 5 b 2022-06-20 0
5 6 c 2023-06-20 0
4条答案
按热度按时间tyg4sfes1#
您可以按
date
对 Dataframe 进行排序,然后计算每个组的累积计数:注意:它之所以有效,是因为
date
在你的 Dataframe 中是唯一的。2izufjch2#
您可以优化代码以更有效地计算所需的结果。您可以利用pandas
groupby
和cumcount
函数的强大功能,而不是使用apply
函数。这些函数允许您执行所需的计算,而无需嵌套循环。下面是更新的代码:
参考文献:
grouby上的Pandas文档cumcount上的Pandas文档
vawmfj5a3#
正如其他答案中所指出的,如果你的日期是唯一的,那么在排序值上使用简单的
groupby.cumcount
就可以了。如果你可以有重复的结果将是不正确的,计算变得更加复杂。
然后,您需要计算每个日期/id的出现次数,然后计算这些值的
cumsum
:日期重复时的差异示例:
gajydyqb4#
下面是使用
rank()
的选项输出: