pandas - 数据框列的日期差异

标签 pandas

我有以下数据框

+-----------------------------+
|           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.diffmean,将时间增量转换为天 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/

相关文章:

python - 使用 Pandas 查找列的最大值并返回相应的行值

python - 带有嵌套列表的 JSON 到 pandas 数据框

python - 为什么我在解析数据帧时会收到错误消息,而当它是单行时却不会收到错误消息?

python - 如何按未排序的列表对数据框进行分组?

python - pandas:连接具有不同列名的数据框

python - 查找 Pandas 索引列值对的最快方法

python Pandas : Resolving "List Object has no Attribute ' Loc'"

python - 在 Python Pandas Dataframe 中计算百分位数

python - Pandas ,合并具有不同索引名称的两行

python - 带有不应相加的文本项的 Pandas groupby