根据月份,ID和熊猫的总和过滤数据

时间:2020-03-11 10:51:04

标签: python pandas datetime filter jupyter-notebook

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

注意:最终数字并不完全正确,我只是想画一幅我想做的事情。

1 个答案:

答案 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
  • 在过去1个月的范围内(2月11日至3月11日),您只有2行 Date为02/26,两者均使用Email wi@gn.c。和Amount的总和 是60 + 60 = 120。
  • 在过去3个月内(12月11日至3月11日),您有6 Date为02/26 / 2020、01 / 26/2020和12/26/2019的行 相同的Email wi@gn.c。 Amount的总和是 60 + 60 + 20 + 37 + 37 + 40 = 254。
  • 在过去6个月内(9月11日至3月11日),您 有8行,其中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。
  • 另外2行,其中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
相关问题