Python 跨多列聚合数据帧

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

我正在尝试为每个零件号创建一个数据帧的通用函数。

数据帧是通过读取一个巨大的csv创建的,它是
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答案的第二部分就是这么做的?