【问题标题】:Python 3.6: Pandas - Obtain earlier occurence of an entry along column of a DataFramePython 3.6:Pandas - 获取沿 DataFrame 列的较早出现的条目
【发布时间】:2017-07-16 08:21:08
【问题描述】:

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

>>> 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

我想要一个额外的列“days_since_event”,如下所示:

    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 万行,使用循环或重复数据子集太慢。

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    您可以按Event 列对数据框进行分组,并计算Daydiff,如下所示:

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

    每个事件的第一次出现都将具有 NaN 值,因此我按照您的问题中的描述用 -1 填充这些值。

    【讨论】:

    • 像魅力一样工作。谢谢你,dune_dweller :)
    猜你喜欢
    • 2019-04-16
    • 2018-09-15
    • 2021-12-16
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多