Python dataframe:如何汇总包含值的列

Python dataframe:如何汇总包含值的列,python,pandas,dataframe,Python,Pandas,Dataframe,这是我的数据框: df= pd.DataFrame( {"mat" : ['A' ,'A', 'A', 'A', 'B'], "ppl" : ['P', 'P', 'P', '', 'P'], "ia1" : ['', 'X', 'X', '', 'X'], "ia2" : ['X', '', '', 'X', 'X']}, index = [1, 2, 3, 4, 5]) 我想在前两列中选择唯一的值。我有: df2 = df.loc[:,['mat','ppl']].drop

这是我的数据框:

df= pd.DataFrame(
{"mat" : ['A' ,'A', 'A', 'A', 'B'],
 "ppl" : ['P', 'P', 'P', '',  'P'],
 "ia1" : ['',  'X', 'X', '',  'X'],
 "ia2" : ['X', '',  '',  'X', 'X']},
index = [1, 2, 3, 4, 5])
我想在前两列中选择唯一的值。我有:

df2 = df.loc[:,['mat','ppl']].drop_duplicates(subset=['mat','ppl']).sort_values(by=['mat','ppl'])
正如所料,我得到:

  mat ppl
4   A    
1   A   P
5   B   P
我现在想要的是,df3是:

 mat ppl ia1 ia2
   A           X
   A   P   X   X
   B   P   X   X
也就是说:在A+p行的
df3
中,在ia1列中,我得到了一个X,因为在
df
行的其中一行的ia1列中有一个X,对于A+p

解决方案,如果多个唯一值与

df = df.groupby(['mat','ppl']).agg(lambda x: ','.join(x[x != ''].unique())).reset_index()
print (df)
  mat ppl ia1 ia2
0   A           X
1   A   P   X   X
2   B   P   X   X
说明:

聚合使用的是
系列
和聚合函数,其中输出为标量。我使用自定义函数,首先通过布尔索引
(x[x!='']
)过滤空空格,然后获取唯一值。对于使用标量输出的
连接
-如果是空序列(所有值都是空字符串),则该函数有效,第二个优点是如果多个唯一值通过
获得一个连接值

对于测试,可以使用与lambda函数相同的自定义函数:

def f(x):
    a = ''.join(x[x != ''].unique().tolist())
    return a

df = df.groupby(['mat','ppl']).agg(f).reset_index()
print (df)
  mat ppl ia1 ia2
0   A           X
1   A   P   X   X
2   B   P   X   X
正如OP的评论所提到的:

我没有使用lambda x:','.join(x[x!='].unique()),而是使用lambda x:','.join(set(x)-set(['])。 我从13分钟5秒提高到43.2秒


请您解释一下
lambda x:','.join(x[x!='].unique())
?请检查答案。我不理解的是
x
表示要聚合的所有列。嗯,我想如果没有指定像
df=df.groupby(['mat','ppl']).agg({'ia1':f})。reset_index()
df df.groupby(['mat','ppl'])这样的列['ia1'].agg(f).reset_index()
然后使用函数
agg
使用所有列并应用aggreagate函数。顺便说一句,谢谢。在一个有100K行的数据帧上,这是非常慢的,而groupby在10列+4列上进行聚合。实际上,非常接近这个问题