List 按组合并列的系列(系列本身)

List 按组合并列的系列(系列本身),list,pandas,merge,group-by,series,List,Pandas,Merge,Group By,Series,我有一个熊猫数据框,其中一列本身就是一个系列。例如: df.head() Col1 Col2 1 ["name1","name2","name3"] 1 ["name3","name2","name4"] 2 ["name1","name2","name3"] 2 ["name1","name5","name6"] 我需要将Col2串联成Col1的组。我想要像这样的东西 Col1 Col2 1 ["n

我有一个熊猫数据框,其中一列本身就是一个系列。例如:

df.head()

Col1    Col2  
1       ["name1","name2","name3"]  
1       ["name3","name2","name4"]  
2       ["name1","name2","name3"] 
2       ["name1","name5","name6"] 
我需要将Col2串联成Col1的组。我想要像这样的东西

Col1    Col2  
1       ["name1","name2","name3","name4"]  
2       ["name1","name2","name3","name5","name6"]
我尝试使用groupby作为

.agg({"Col2":lambda x: pd.Series.append(x)})
但这会抛出一个错误,即需要两个参数。我还尝试在agg函数中使用sum。错误导致的失败不会减少


我该怎么做呢?

是的,你不能对这样的分类数据使用
.aggby{}
。不管怎样,这是我在这个问题上的一个尝试,利用numpy的帮助。(为清晰起见,请发表评论)

更精简的版本如下所示:

d = {}
for i,val in enumerate(df["Col1"].unique()):
    d.setdefault("Col1",[]).append(val)
    sdf = df.loc[df["Col1"]==val]
    d.setdefault("Col2",[]).append(np.unique([[j for j in array] for i,array in enumerate(df.loc[df["Col1"]==val, "Col2"].values)]))
new_df = pd.DataFrame(d)
print(new_df)
通过签出了解Python的
.setdefault()
字典函数的更多信息。

您可以与
应用
自定义函数一起使用,其中首先通过
链展平嵌套列表(最快),然后通过
删除重复项,转换为
列表
,最后排序:

import pandas as pd
from  itertools import chain

df = pd.DataFrame({'Col1':[1,1,2,2],
                   'Col2':[["name1","name2","name3"],
                           ["name3","name2","name4"],
                           ["name1","name2","name3"],
                           ["name1","name5","name6"]]})

print (df)
   Col1                   Col2
0     1  [name1, name2, name3]
1     1  [name3, name2, name4]
2     2  [name1, name2, name3]
3     2  [name1, name5, name6]
解决方案可以更简单,只需要
排序

print (df.groupby('Col1')['Col2']
         .apply(lambda x: sorted(set(chain.from_iterable(x))))
         .reset_index())

   Col1                                 Col2
0     1         [name1, name2, name3, name4]
1     2  [name1, name2, name3, name5, name6]
print (df.groupby('Col1')['Col2']
         .apply(lambda x: sorted(list(set(list(chain.from_iterable(x))))))
         .reset_index())
   Col1                                 Col2
0     1         [name1, name2, name3, name4]
1     2  [name1, name2, name3, name5, name6]
print (df.groupby('Col1')['Col2']
         .apply(lambda x: sorted(set(chain.from_iterable(x))))
         .reset_index())

   Col1                                 Col2
0     1         [name1, name2, name3, name4]
1     2  [name1, name2, name3, name5, name6]