Python 熊猫:将每列聚合到一个逗号分隔的列表中,不重复
问题: 我有一个大的CSV文件,看起来像这样: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
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)))
。天哪,我不知道如何连接,但它完全符合我的要求。非常感谢你。