Python 列A值基于列B的groupby聚合
我有一个带有捐赠信息的熊猫数据框,示例如下:Python 列A值基于列B的groupby聚合,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个带有捐赠信息的熊猫数据框,示例如下: DonorID DonationID Date Amount a1234 3767 1/1/2019 $100 a1234 2193 2/1/2019 $50 a1234 0915 3/1/2019 $75 b5678 4562 5/1/2019 $45 b5678 8965
DonorID DonationID Date Amount
a1234 3767 1/1/2019 $100
a1234 2193 2/1/2019 $50
a1234 0915 3/1/2019 $75
b5678 4562 5/1/2019 $45
b5678 8965 4/1/2019 $80
我正在使用groupby函数来计算每个DonorID的总金额和min date,但我也想计算DonorID最早的捐赠金额和捐赠金额
df2 = df1.groupby(['DonorID'], as_index=False ).agg( {'Amount':sum,'Date':min})
电流输出为:
DonorID Amount Date
a1234 $225 1/1/2019
b5678 $125 4/1/2019
所需的输出应符合以下要求:
DonorID Amount Date First Gift Amount DonationID
a1234 $225 1/1/2019 $100 3767
b5678 $125 4/1/2019 $80 8965
任何帮助都将不胜感激 您可能想要这样的东西:
df.sort_values('Date').groupby(['DonorID'], as_index=False)\
.agg({'Amount':['sum', 'first'], 'Date': 'min', 'DonationID': 'first'})
有两种方法可以实现这一点
“日期”
列中对数据帧进行排序。这将确保当您使用聚合方法“first”
时,您将获得与最小日期对应的值排序\u值
(无论出于何种原因)。您可以指定一个临时列来获取日期列的idxmin()
。然后,您可以使用map
从原始数据帧中提取相关值:
下面是一种使用
agg()
方法解包字典的方法。这允许您使用带有空格的列名
df['Date'] = pd.to_datetime(df['Date'])
df['Amount'] = df['Amount'].str.replace('$','')
df['Amount'] = pd.to_numeric(df['Amount'])
df.sort_values(by='Date',ascending=True).groupby('DonorID').agg(**{'Amount': ('Amount','sum'),'Date':('Date','first'),'First Gift Amount': ('Amount','first'),'DonationID':('DonationID','first')})
df2 = (df1
.groupby(["DonorID"], as_index=False)
.agg(
amount=("Amount", "sum"),
date=("Date", "min"),
min_date_idx=("Date", "idxmin"))
.assign(
first_amount=lambda d: d["min_date_idx"].map(df1["Amount"]),
donation_id=lambda d: d["min_date_idx"].map(df1["DonationID"])
))
print(df2)
DonorID amount date min_date_idx first_amount donation_id
0 a1234 225 2019-01-01 0 100 3767
1 b5678 125 2019-04-01 4 80 8965
df['Date'] = pd.to_datetime(df['Date'])
df['Amount'] = df['Amount'].str.replace('$','')
df['Amount'] = pd.to_numeric(df['Amount'])
df.sort_values(by='Date',ascending=True).groupby('DonorID').agg(**{'Amount': ('Amount','sum'),'Date':('Date','first'),'First Gift Amount': ('Amount','first'),'DonationID':('DonationID','first')})