ID. Email. Amount Date
1. wi@gn.c. 20 26-11-19 12.06.36.726000
2. wi@gn.c. 40 26-12-19 12.06.37.293000
3. by@gn.c. 50 26-11-19 12.06.37.960000
4. wi@gn.c. 20 26-01-20 12.06.51.306000
5. wi@gn.c. 60 26-02-20 12.06.52.458000
6. by@gn.c. 15 26-08-19 12.06.58.397000
7. wi@gn.c. 37 26-12-19 12.07.00.191000
5. wi@gn.c. 60 26-02-20 12.06.52.458000
6. by@gn.c. 15 26-08-19 12.06.58.397000
7. wi@gn.c. 37 26-12-19 12.07.00.191000
我需要获取过去1个月,3个月和6个月每个电子邮件地址的总金额。我尝试了几种命令组合,但现在迷路了。
在另一个答案中,df.groupby('Email')['Amount'].sum().reset_index()
有用,但我需要根据1个月,3个月和6个月来加总。
预期结果将如下所示
ID. Email. Total for past 1 Month Total for past 3 Month Total for past 6 Month
1. wi@gn.c. 20 40 60
3. by@gn.c. 50 50 100
注意:最终数字并不完全正确,我只是想画一幅我想做的事情。
答案 0 :(得分:1)
希望这会有所帮助:首先将“日期”列转换为DateTimeIndex。然后,您必须将数据分为1个月,3个月和6个月的组,并创建3 dfs。通过“金额”之和汇总这3个df。最后,在“电子邮件”列上合并所有这3个df。
import numpy as np
import pandas as pd
df = pd.DataFrame([[1,'wi@gn.c.',20,'26-11-19 12.06.36.726000'],
[2,'wi@gn.c.',40,'26-12-19 12.06.37.293000'],
[3,'by@gn.c.',50,'26-11-19 12.06.37.960000'],
[4,'wi@gn.c.',20,'26-01-20 12.06.51.306000'],
[5,'wi@gn.c.',60,'26-02-20 12.06.52.458000'],
[6,'by@gn.c.',15,'26-08-19 12.06.58.397000'],
[7,'wi@gn.c.',37,'26-12-19 12.07.00.191000'],
[6,'wi@gn.c.',60,'26-02-20 12.06.52.458000'],
[7,'by@gn.c.',15,'26-08-19 12.06.58.397000'],
[8,'wi@gn.c.',37,'26-12-19 12.07.00.191000']],
columns=['ID','Email','Amount','Date'])
# convert your 'Date' to datetimeindex
df['Date'] = pd.to_datetime(df['Date'], format = '%d-%m-%y %H.%M.%S.%f')
df.set_index('Date', inplace=True)
df.sort_index(inplace=True)
# create dfs from base df for past 1 month, 3 months and 6 months data and aggregate by sum of 'Amount'
end = pd.datetime.now()
df_1mo = df.loc[end - pd.DateOffset(months=1): end].groupby('Email')['Amount'].agg(total_1mo=np.sum)
df_3mo = df.loc[end - pd.DateOffset(months=3): end].groupby('Email')['Amount'].agg(total_3mo=np.sum)
df_6mo = df.loc[end - pd.DateOffset(months=6): end].groupby('Email')['Amount'].agg(total_6mo=np.sum)
# merge all 3 dfs on 'Email'
print(df_1mo.merge(df_3mo, on='Email', how='outer').merge(df_6mo, on='Email', how='outer').fillna(0))
输出:
total_1mo total_3mo total_6mo
Email
wi@gn.c. 120.0 254.0 274
by@gn.c. 0.0 0.0 50
Date
为02/26,两者均使用Email
wi@gn.c。和Amount
的总和
是60 + 60 = 120。 Date
为02/26 / 2020、01 / 26/2020和12/26/2019的行
相同的Email
wi@gn.c。 Amount
的总和是
60 + 60 + 20 + 37 + 37 + 40 = 254。 Date
为02/26 / 2020、01 / 26 / 2020、12 / 26/2020和
11/26/2019。其中的一行是@ gn.c的Email
。并且Amount
为50。所有其他行均与Email
wi@gn.c一起使用。 Amount
的总和为60 + 60 + 20 + 37 + 37 + 40 + 20 = 274。 Date
为
2020年8月26日不在6个月的范围内,因此将其排除在外。希望这可以解释答案。您可以将end
日期更改为其他日期以作为基准日期。在这里,我将当前日期用作基准日期。
可能有一个更好的解决方案。但这应该基于您的样本数据集。让我知道怎么回事。
更新:最小和最大:
df_1mo = df.loc[end - pd.DateOffset(months=1): end].groupby('Email')['Amount'].agg(total_1mo=np.max)
df_3mo = df.loc[end - pd.DateOffset(months=3): end].groupby('Email')['Amount'].agg(total_3mo=np.max)
df_6mo = df.loc[end - pd.DateOffset(months=6): end].groupby('Email')['Amount'].agg(total_6mo=np.max)
# merge all 3 dfs on 'Email'
print(df_1mo.merge(df_3mo, on='Email', how='outer').merge(df_6mo, on='Email', how='outer').fillna(0))
输出:
total_1mo total_3mo total_6mo
Email
wi@gn.c. 60.0 60.0 60
by@gn.c. 0.0 0.0 50