Pandas 将多行中的值合并到一行中
我正在处理几个具有多对多关系的表。转换此数据以确保“类别”列是唯一的,并且所有相应的单位都合并到一行中的最有效方法是什么Pandas 将多行中的值合并到一行中,pandas,Pandas,我正在处理几个具有多对多关系的表。转换此数据以确保“类别”列是唯一的,并且所有相应的单位都合并到一行中的最有效方法是什么 category unit A01 97337 A01 97333 A01 97334 A01 97343 A01 26223 A01 26226 A01 22722 A01 93397 A01 97332 A01
category unit
A01 97337
A01 97333
A01 97334
A01 97343
A01 26223
A01 26226
A01 22722
A01 93397
A01 97332
A01 97342
A01 97369
A01 97734
A01 97332
P76 97343
P76 26223
P76 27399
P76 27277
P76 27234
P76 27297
P76 27292
P76 22723
P76 93622
P76 27343
P76 27234
P98 97337
为此:
category category_units
A01 97337, 97333, 97334, 97343, 26223, 26226, 22722, 93397, 97332, 97342, 97369, 97734, 97332
P76 97343, 26223, 93622, 99733, 27399, 27277, 27234, 27297, 27292
P98 97337
每个类别一行(用作主键),其中每个对应的单元连接成一列,值用逗号分隔
我将把这些数据连接回另一个事实表,最终最终用户将过滤“包含”某些值的类别单位,这样它将调出与该值关联的所有行。您可以使用
groupby
和apply
join
,如果单位
列为数字,则必须将其转换为字符串
:
df1 = df.groupby('category')['unit']
.apply(lambda x: ', '.join(x.astype(str)))
.reset_index()
print (df1)
category unit
0 A01 97337, 97333, 97334, 97343, 26223, 26226, 2272...
1 P76 97343, 26223, 27399, 27277, 27234, 27297, 2729...
2 P98 97337
另一种先浇铸的解决方案:
df.unit = df.unit.astype(str)
df1 = df.groupby('category')['unit'].apply(', '.join).reset_index()
print (df1)
category unit
0 A01 97337, 97333, 97334, 97343, 26223, 26226, 2272...
1 P76 97343, 26223, 27399, 27277, 27234, 27297, 2729...
2 P98 97337
很酷,很好用。由于某些联接(许多中间表)的性质,我的最终结果在一行中有一些重复项。例如,类别=A01,单位=973372622397337。有没有一种方法可以干净地删除行级别上的重复项?我曾考虑使用.str.split(),但后来我不知道如何只保留每行的唯一值。您可以使用
set
或unique
像df1=df.groupby('category')['unit'].apply(lambda x:','.join(x.unique().astype(str))
或df1=df.groupby('category')['unit'])。apply(lambda x:“,”.join(set(x.astype(str)))
这一切都很好地工作。实际上,我不得不将其应用于多对多表,结果正是我想要的。谢谢