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)))
这一切都很好地工作。实际上,我不得不将其应用于多对多表,结果正是我想要的。谢谢