Python 熊猫:将每列聚合到一个逗号分隔的列表中,不重复

Python 熊猫:将每列聚合到一个逗号分隔的列表中,不重复,python,python-3.x,pandas,Python,Python 3.x,Pandas,问题: 我有一个大的CSV文件,看起来像这样: A B C D ... 1 dog black NULL ... 1 dog white NULL ... 1 dog black NULL ... 2 cat red NULL ... ... A B C D ... 1 dog black, white NULL ... 2 cat red NULL ... ... A B C

问题:

我有一个大的CSV文件,看起来像这样:

A  B   C     D    ...
1  dog black NULL ...
1  dog white NULL ...
1  dog black NULL ...
2  cat red   NULL ...
...
A  B   C             D    ...
1  dog black, white  NULL ...
2  cat red           NULL ...
...
A  B       C                   D      ...
1  {'dog'} {'black', 'white'}  {None} ...
2  {'cat'} {'red'}             {None} ...
...
现在我想“分组”列
A
,并将剩余的每一列聚合到一个逗号分隔的列表中,不重复。解决方案应如下所示:

A  B   C     D    ...
1  dog black NULL ...
1  dog white NULL ...
1  dog black NULL ...
2  cat red   NULL ...
...
A  B   C             D    ...
1  dog black, white  NULL ...
2  cat red           NULL ...
...
A  B       C                   D      ...
1  {'dog'} {'black', 'white'}  {None} ...
2  {'cat'} {'red'}             {None} ...
...
由于CSV中的名称和列数可能会更改,因此我更喜欢没有硬编码名称的解决方案

使用的方法:

我使用以下代码尝试了程序包
pandas

import pandas as pd
data = pd.read_csv("C://input.csv", sep=';')
data = data.where((pd.notnull(data)), None)
data_group = data.groupby(['A']).agg(lambda x: set(x))
data_group.to_csv("C://result.csv", sep=';')
set
操作符正是我想要的。但是,生成的CSV如下所示:

A  B   C     D    ...
1  dog black NULL ...
1  dog white NULL ...
1  dog black NULL ...
2  cat red   NULL ...
...
A  B   C             D    ...
1  dog black, white  NULL ...
2  cat red           NULL ...
...
A  B       C                   D      ...
1  {'dog'} {'black', 'white'}  {None} ...
2  {'cat'} {'red'}             {None} ...
...
我不希望导出中的
{}
'
以及
D
列应为空且不包含单词
None

问题:


我走的是正确的道路,还是有更优雅的方式来实现我的目标

用逗号连接集

df.groupby('A', as_index=False).agg(lambda x: ', '.join(set(x.dropna())))

#   A    B             C D
#0  1  dog  white, black  
#1  2  cat           red  

解决方案看起来很有希望。但是,如果我运行您的代码,它会完全删除D列和所有包含数值的列。如果您也想连接数值列,请尝试
df.groupby('A',as_index=False.).agg(lambda x:','.join(set(x.astype(str)))
。天哪,我不知道如何连接,但它完全符合我的要求。非常感谢你。