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')})