我有一个像这样的 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_datetime
将 transaction_date
列转换为 pandas datetime
In [2947]: df.transaction_date = pd.to_datetime(df.transaction_date)
现在,使用 Groupby.shift
在 df
中添加一个新列,其中包含两次交易之间的天数差异并使用 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/