我正在尝试创建一个通用函数,以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()
到每一列
答案 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