【问题标题】:split, groupby, combine in Pandas to find a difference in dates在 Pandas 中拆分、分组、组合以查找日期差异
【发布时间】:2015-09-03 12:13:52
【问题描述】:

我有一个如下所示的简单数据框:

我想使用groupby按id分组,然后找到一些方法来区分日期,然后将它们列绑定回数据框,所以我最终得到了这个:

groupby 很简单,

grouped = DF.groupby('id')

找到最早的日期很简单,

maxdates = grouped['date'].min()

但我不确定如何继续。如何应用日期减法运算,然后合并?

有一个类似的问题here

感谢您阅读本文。

我的数据框是:

dates=pd.to_datetime(['2015-01-01', '2015-02-01', '2015-03-01', '2015-04-01', '2015-05-01', '2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05'])

DF = DataFrame({'id':[1,1,1,1,1,2,2,2,2,2], 'date':dates})
cols = ['id', 'date']
DF=DF[cols]

编辑: 下面的两个答案都很棒。我希望我能接受他们两个。

【问题讨论】:

    标签: python date pandas


    【解决方案1】:

    你可以像这样使用apply:

    earliest_by_id = DF.groupby('id')['date'].min()
    def since_earliest(row):
        return row.date - earliest_by_id[row.id]
    
    DF['days_since_earliest'] = DF.apply(since_earliest, axis=1)
    print(DF)
    

       id       date  days_since_earliest
    0   1 2015-01-01               0 days
    1   1 2015-02-01              31 days
    2   1 2015-03-01              59 days
    3   1 2015-04-01              90 days
    4   1 2015-05-01             120 days
    5   2 2015-01-01               0 days
    6   2 2015-01-02               1 days
    7   2 2015-01-03               2 days
    8   2 2015-01-04               3 days
    9   2 2015-01-05               4 days
    

    编辑:

    DF['days_since_earliest'] = DF.apply(since_earliest, axis=1).astype('timedelta64[D]')
    print(DF)
    
       id       date  days_since_earliest
    0   1 2015-01-01                    0
    1   1 2015-02-01                   31
    2   1 2015-03-01                   59
    3   1 2015-04-01                   90
    4   1 2015-05-01                  120
    5   2 2015-01-01                    0
    6   2 2015-01-02                    1
    7   2 2015-01-03                    2
    8   2 2015-01-04                    3
    9   2 2015-01-05                    4
    

    【讨论】:

    • 熊猫真是太棒了。 APL 遗产 FTW!
    • @DTing 我不知道DF.dateDF["date"] 是同义词。 Pandas 中的索引是一个疯狂的过程,[ ], .ix, .loc. .iloc 等等等等。我想我会将. 添加到列表中。还有——为什么这个函数返回x days?我们如何摆脱文本days? Pandas 似乎很冒昧地在其中注入文本。实际上,一个同样紧迫的问题是,该操作如何以天为单位返回值?为什么不是几年或几个月?这里发生了非常神秘的事情......
    • days_since_earliest 的数据类型为timedelta64[ns]。您可以使用以下方式进行转换:pandas.pydata.org/pandas-docs/dev/…
    【解决方案2】:

    FWIW,使用transform 通常比apply 更简单(通常更快)。 transform 获取 groupby 操作的结果并将其广播到原始索引:

    >>> df["dse"] = df["date"] - df.groupby("id")["date"].transform(min)
    >>> df
       id       date      dse
    0   1 2015-01-01   0 days
    1   1 2015-02-01  31 days
    2   1 2015-03-01  59 days
    3   1 2015-04-01  90 days
    4   1 2015-05-01 120 days
    5   2 2015-01-01   0 days
    6   2 2015-01-02   1 days
    7   2 2015-01-03   2 days
    8   2 2015-01-04   3 days
    9   2 2015-01-05   4 days
    

    如果您更喜欢整数天而不是 timedelta 对象,您可以使用 dt.days 访问器:

    >>> df["dse"] = df["dse"].dt.days
    >>> df
       id       date  dse
    0   1 2015-01-01    0
    1   1 2015-02-01   31
    2   1 2015-03-01   59
    3   1 2015-04-01   90
    4   1 2015-05-01  120
    5   2 2015-01-01    0
    6   2 2015-01-02    1
    7   2 2015-01-03    2
    8   2 2015-01-04    3
    9   2 2015-01-05    4
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2016-05-05
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多