将多行的值组合成一行

时间:2017-02-17 14:16:27

标签: pandas

我正在处理几个具有多对多关系的表。转换此数据以确保类别列是唯一的并且所有相应单元组合成一行的最有效方法是什么?

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

每个类别一行(用作主键),其中每个相应的单元连接成一个列,其值以逗号分隔。

我会将这些数据加回到另一个事实表中,最终最终用户会过滤category_units,其中'包含'某个值,因此它将拉出与该值相关联的所有行。

1 个答案:

答案 0 :(得分:3)

您可以groupbyapply join一起使用,如果unit列为数字,则必须强制转换为string

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