我有以下数据框
+-----------------------------+
| app_id mail_dt |
+-----------------------------+
| 100255 12000017 2009-03-23 |
| 129628 12000017 2009-09-04 |
| 183069 12000017 2010-03-19 |
| 125231 12000031 2009-08-18 |
| 204245 12000031 2010-05-12 |
| 296410 12000031 2010-10-06 |
| 183030 12000044 2010-03-17 |
| 291704 12000044 2010-09-29 |
| 635932 12000044 2011-09-23 |
+-----------------------------+
我需要计算相同app_id
的连续日期时间差异,然后计算相应mail_dt
差异的平均值
假设 app_id = 12000017 如下
df.loc[129628,'mail_dt'] - df.loc[100255,'mail_dt']
Out[25]: Timedelta('165 days 00:00:00')
df.loc[183069,'mail_dt'] - df.loc[129628,'mail_dt']
Out[26]: Timedelta('196 days 00:00:00')
平均值为 180.5 天(让我们将其降低到 180)
所以,我的问题是如何计算每个 app_id
的平均值并构建以下数据帧
+----------+------------+
| app_id | mean_delta |
+----------+------------+
| 12000017 | 180 |
| 12000031 | 207 |
+----------+------------+
当然,可以迭代所有app_id
并计算平均timedelta值,但我想知道是否有一种基于groupby和其他函数的漂亮解决方案。提前致谢
最佳答案
想法是通过 GroupBy.agg
获得每组的差异与 Series.diff
和 mean
,将时间增量转换为天 Series.dt.days
最后 2 列 DataFrame by Series.reset_index
:
#if necessary
df['mail_dt'] = pd.to_datetime(df['mail_dt'])
df1 = (df.groupby('app_id')['mail_dt']
.agg(lambda x: x.diff().mean())
.dt.days
.reset_index(name='avg'))
print (df1)
app_id avg
0 12000017 180
1 12000031 207
2 12000044 277
关于pandas - 数据框列的日期差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60830941/