Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3.6:Pandas—获取数据帧列中较早出现的条目_Python_Python 3.x_Pandas - Fatal编程技术网

Python3.6:Pandas—获取数据帧列中较早出现的条目

Python3.6:Pandas—获取数据帧列中较早出现的条目,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个熊猫数据框,有两列——“天”和“事件”。每天都可能发生任意数量的事件,每个事件都由一个字符表示。我想构造一个额外的列,指示自上次事件发生以来已经过去了多少天。下面的代码可以说明这一点: >>> import pandas as pd >>> event_data = pd.DataFrame({'Day':[1,1,1,1,2,2,2,3,3,4,4,4,4], 'Event':['A','B

我有一个熊猫数据框,有两列——“天”和“事件”。每天都可能发生任意数量的事件,每个事件都由一个字符表示。我想构造一个额外的列,指示自上次事件发生以来已经过去了多少天。下面的代码可以说明这一点:

>>> import pandas as pd
>>> event_data = pd.DataFrame({'Day':[1,1,1,1,2,2,2,3,3,4,4,4,4], 
                             'Event':['A','B','C','D','B','F','A','B','C','G','A','B','D']})
>>> print(event_data)

     Day Event
0     1     A
1     1     B
2     1     C
3     1     D
4     2     B
5     2     F
6     2     A
7     3     B
8     3     C
9     4     G
10    4     A
11    4     B
12    4     D
我想要一个额外的专栏“事件发生后的天数”,它看起来像:

    Day Event  Days_since_event
0     1     A                -1
1     1     B                -1
2     1     C                -1
3     1     D                -1
4     2     B                 1
5     2     F                -1
6     2     A                 1
7     3     B                 1
8     3     C                 2
9     4     G                -1
10    4     A                 2
11    4     B                 1
12    4     D                 3
第12行的值为3,因为事件“D”发生在第4天,上一次发生在第1天,这意味着自事件“D”上次发生以来已经过去了3天。值为-1的行表示该事件在该天首次发生


做这件事的最佳计算方法是什么?原始数据集有超过1000万行,使用循环或重复数据子集太慢。

您可以按
事件
列对数据帧进行分组,并计算
日期
的差异,如下所示:

event_data['Days_since_event'] = event_data.groupby('Event')['Day']\
                                           .diff().fillna(-1).astype(int)

每个事件的第一次出现都会有
NaN
值,因此我用-1填充它们,如您的问题所述。

您可以按
event
列对数据帧进行分组,并计算
Day
diff
,如下所示:

event_data['Days_since_event'] = event_data.groupby('Event')['Day']\
                                           .diff().fillna(-1).astype(int)

每个事件的第一次出现都会有
NaN
值,所以我用-1填充它们,正如您在问题中所描述的那样。

工作起来很有魅力。谢谢你,沙丘居民:)工作起来很有魅力。谢谢你,沙丘居民:)