Python 跨多列聚合数据帧
我正在尝试为每个零件号创建一个数据帧的通用函数。 数据帧是通过读取一个巨大的csv创建的,它是Python 跨多列聚合数据帧,python,pandas,dataframe,aggregate,Python,Pandas,Dataframe,Aggregate,我正在尝试为每个零件号创建一个数据帧的通用函数。 数据帧是通过读取一个巨大的csv创建的,它是115371 x 174。例如,我已将数据缩减到下表: | Part | Plant | Make_Buy | |:----:|:-----:|:--------:| | A | | Buy | | A | XXX | Make | | A | XXX | Buy | | A | XXY | Buy | | A
115371 x 174
。例如,我已将数据缩减到下表:
| 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
我已经研究过通过文本列进行聚合,但我不知道如何进行常规更改:
df['part'] = df[['part','plant','make_buy']].groupby(['part'])['part'].transform(lambda x: ','.join(x))
df[['part','plant','make_buy']].drop_duplicates()
对于每一列,您可以使用
集合
来实现以下目的:
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
您可以为此使用
集合
:
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
df.groupby('Part').agg(lambda x:','.join(set(x))
仅返回make_buy
变量。@wundermahn:如果希望将df.groupby('Part').agg(set)
作为列表,则可以执行df.groupby('Part').agg(set).apply(lambda x:x.apply(list))
。我希望它不是列中的数据结构,最后,我将使用sklearn
对其进行虚拟编码。有没有办法将它保持为字符串,但用逗号分隔@ybml@wundermahn这就是答案的第二部分所做的?df.groupby('part').agg(lambda x:','.join(set(x))
只返回make_buy
变量。@wundermahn:如果您想将df.groupby('part').agg(set)作为列表,您可以执行df.groupby('part').agg(set').apply)。apply(lambda x:x.apply(list))
。我希望它不是列中的数据结构,因为我将使用sklearn
对其进行虚拟编码。有没有办法将它保持为字符串,但用逗号分隔@ybml@wundermahn答案的第二部分就是这么做的?