跨多个列汇总数据框

时间:2020-03-12 14:48:43

标签: python pandas dataframe aggregate

我正在尝试创建一个通用函数,以aggregate熊猫数据框为每个部件号单行。

数据帧是通过读取巨大的csv(115,371 x 174)来创建的。对于一个minimal, complete, verifiable示例,我将数据简化为下表:

| Part | Plant | Make_Buy |
|:----:|:-----:|:--------:|
|   A  |       |    Buy   |
|   A  |  XXX  |   Make   |
|   A  |  XXX  |    Buy   |
|   A  |  XXY  |    Buy   |
|   A  |  XXY  |   Make   |
|   B  |   YY  |   Make   |
|   B  |  XXY  |   Make   |

这里也作为Python代码:

import pandas as pd

d = {'part': ['A', 'A', 'A', 'A', 'A', 'B', 'B'], 
     'plant': [None, 'XXX', 'XXX', 'XXY', 'XXY', 'YY', 'XXY'],
     'make_buy': ['Buy', 'Make', 'Buy', 'Buy', 'Make', 'Make', 'Make']}
df = pd.DataFrame(data=d)

理想的功能将能够执行以下操作:

对于单个部分包含多个值的任何列,请对其进行汇总。

理想的数据框如下所示:

| Part |   Plant  |  Make_Buy |
|:----:|:--------:|:---------:|
|   A  | XXX, XXY | Buy, Make |
|   B  |  YY, XXY |    Make   |

问题是,有175列。因此,我需要足够通用的东西来扫描每一列,如果有多行,则应用聚合。我知道在Oracle SQL中我可以做到:

SELECT
Part,
LISTAGG(col1, ', ') AS col1,
LISTAGG(col2, ', ') AS col2,
etc

FROM
table

我已经通过文本列via the following post查看了汇总,但是我不知道如何进行一般性的更改:

df['part'] = df[['part','plant','make_buy']].groupby(['part'])['part'].transform(lambda x: ','.join(x))
df[['part','plant','make_buy']].drop_duplicates()

到每一列

1 个答案:

答案 0 :(得分:3)

您可以为此使用sets

df.groupby('Part').agg(set)

          Plant     Make_Buy
Part                         
A     {XXY, XXX}  {Buy, Make}
B      {YY, XXY}       {Make}

要将结果作为字符串:

df.groupby('Part').agg(lambda x: ', '.join(set(x)))

       Plant   Make_Buy
Part                     
A     XXY, XXX  Buy, Make
B      YY, XXY       Make