Python split、groupby和Pandas组合,以找出日期的差异

Python split、groupby和Pandas组合,以找出日期的差异,python,date,pandas,Python,Date,Pandas,我有一个简单的数据框,如下所示: 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) 我想使用groupby按id分组,然后找到一些方法来区分日期,然后将它们列绑定回数

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

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)

我想使用
groupby
按id分组,然后找到一些方法来区分日期,然后将它们列绑定回数据帧,因此我最终得出以下结论:

groupby很简单

grouped = DF.groupby('id')
maxdates = grouped['date'].min()
找到最早的日期很简单

grouped = DF.groupby('id')
maxdates = grouped['date'].min()
但我不知道该怎么做。如何应用日期减法运算,然后合并

还有一个类似的问题

谢谢你读到这里

我的数据帧是:

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]
编辑:
下面的两个答案都很棒。我希望我能同时接受它们。

您可以这样使用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)

编辑:

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
FWIW,使用通常比
apply
更简单(通常更快)<代码>转换获取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

熊猫太神奇了。那是APL传统FTW@我不知道
DF.date
DF[“date”]
是同义词。在熊猫中建立索引是一个疯狂的过程,使用
[]、.ix、.loc。iloc
等。我想我会把
添加到列表中。另外--为什么此函数返回
x天
?我们如何摆脱文本
days
?熊猫那样在里面插入文字似乎很冒昧。实际上,一个同样紧迫的问题是,操作如何在开始的几天内返回值?为什么不是几年或几个月?这里发生了非常神秘的事情……最早的
天的数据类型是
timedelta64[ns]
。您可以使用以下命令进行转换:。