我正在处理几个具有多对多关系的表。转换此数据以确保类别列是唯一的并且所有相应单元组合成一行的最有效方法是什么?
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,其中'包含'某个值,因此它将拉出与该值相关联的所有行。
答案 0 :(得分:3)
您可以groupby
与apply
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