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列上进行聚合。实际上,非常接近这个问题