python - pandas 按列分组,然后从每个组的日期列中获取平均天数

标签 python python-3.x pandas dataframe data-analysis

我有一个像这样的 pandas 数据名:

    customer_id    transaction_date   ......................
 0    12341          2011-05-06
 1    12341          2011-06-22
 2    12341          2011-05-09
 3    12342          2011-06-16
 4    12342          2011-07-26
 5    12342          2011-03-06
 6    12343          2011-05-16
 7    12343          2011-04-25
 8    12342          2011-07-12
 9    12343          2011-05-09
 10   12343          2011-04-12
 11   12342          2011-07-03

我正在尝试计算客户进行交易的平均间隔。换言之,每位客户每隔多少天进行一次交易。

这是我尝试过的:

dummy_data.groupby(by=['customer_id'])['transaction_date'].transform('mean')

我得到:

DataError: No numeric types to aggregate

我该怎么做?

编辑 1:

预期输出:

customer_id   avg_days
  12341         24
  12342         ..
  12343         ..

解释:
对于 ID 为“12341”的客户,第一次交易的日期是 5 月 6 日,下一次交易的日期是 5 月 9 日,下一次交易的日期是 6 月 22 日。因此,前两次交易之间的天数差异为 3 天,下一次交易之间的天数为 45 天。所以,3 和 45 的平均值是 (45+3/2 = 48/2 = 24)。然后我需要为数据框中的所有客户执行此操作。

最佳答案

首先使用 pd.to_datetimetransaction_date 列转换为 pandas datetime

In [2947]: df.transaction_date = pd.to_datetime(df.transaction_date)

现在,使用 Groupby.shiftdf 中添加一个新列,其中包含两次交易之间的天数差异并使用 Groupby.mean 求平均值:

In [2976]: df['days'] = (df.sort_values('transaction_date').groupby('customer_id').transaction_date.shift() - df.transaction_date).dt.days.abs()

In [2985]: x = df.groupby('customer_id', as_index=False)['days'].mean().round()

In [2986]: x
Out[2986]: 
   customer_id  days
0        12341  24.0
1        12342  36.0
2        12343  11.0

关于python - pandas 按列分组,然后从每个组的日期列中获取平均天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64940355/

相关文章:

python - 检查文件是否存在,如果不存在则创建它

python - Paramiko 没有名为 pycrypto 的模块

python - 根据无序日期在 pandas 中创建日期时间对象

python-3.x - 用于设置 virtualenv 和 pip 的 Shell 脚本

python - 当列名不同时如何将数据框附加到另一个数据框(具有相同的列大小)

python - Pandas 数据框中多列的聚合

python - Pandas 数据框 : how to permute rows and create new groups of combinations

python - 无法在嵌入 Python 的多线程 C 应用程序中终止多处理池

python - Flask:重定向(url_for())返回html但不加载页面

python - 保留列表中的确切单词并删除其他单词