使用AGG求和并应用列表的Groupby MultiIndex Pandas系列

时间:2018-10-23 10:04:39

标签: python pandas

我有两个多索引系列

系列1

Company Name     Product     Price        TransactionID
Company A        Apple       10           T0001
Company B        Grapes      20           T0002
                 Orange      30           T0003

系列2

Company Name     Product     Price        TransactionID
Company A        Orange      10           T0004
                 Apple       20           T0005
Company B        Orange      20           T0006

我想像下面这样组成系列

Company Name     Product     Sum_price    TransactionID
Company A        Orange      10           [T0004]
                 Apple       30           [T0001,T0005]
Company B        Orange      50           [T0003,T0006]
                 Grapes      20           [T0002]

来自Group dataframe and get sum AND count?的内容表明,我可以同时使用.agg进行求和和计数,但是如何将.apply(list)应用于求和?现在,我已将代码Pandas: adding multiindex Series/Dataframes containing lists应用到两个序列中,一个序列是sum,另一个序列是具有transactionID的序列。我想我可以将两个系列合并在一起,但是我只想看看是否有更好的方法可以做到这一点。

2 个答案:

答案 0 :(得分:1)

您可以先合并两个数据框,如下所示:

df3 = pd.concat([df1, df2])

此后,您可以使用groupby agg来求和,还可以使用lambda函数来连接列表

df3 = df3.groupby(['Company', 'Name', 'Product']).agg({'Price':sum, 'TransactionID': lambda x: [i for i in x]})

然后您将得到所需的输出,如下所示:

Company Name     Product     Sum_price    TransactionID
Company A        Orange      10           [T0004]
                 Apple       30           [T0001,T0005]
Company B        Orange      50           [T0003,T0006]
                 Grapes      20           [T0002]

答案 1 :(得分:1)

concataggregatesum一起使用,并转换为list

df = (pd.concat([df1, df2])
        .groupby(['Company Name', 'Product'], as_index=False)
        .agg({'Price':'sum', 'TransactionID': lambda x: x.tolist()})
     )
print (df)
  Company Name Product  Price   TransactionID
0    Company A   Apple     30  [T0001, T0005]
1    Company A  Orange     10         [T0004]
2    Company B  Grapes     20         [T0002]
3    Company B  Orange     50  [T0003, T0006]