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]
。您可以使用以下命令进行转换:。