我有一个数据框,如:
material plant Order m1 m2 m3 m4 m5
24990 89952 4568789 1.0 1.0 0.0 0.0 0.0
24990 89952 5098710 1.0 1.0 0.0 0.0 0.0
24990 89952 9448609 0.0 0.0 1.0 0.0 1.0
24990 89952 1007081 0.0 0.0 1.0 0.0 1.0
166621 3062 18364103 0.0 0.0 0.0 0.0 0.0
166621 3062 78309139 0.0 1.0 0.0 0.0 0.0
240758 3062 55146035 1.0 1.0 1.0 0.0 0.0
276009 3062 38501581 1.0 1.0 1.0 0.0 0.0
276009 3062 38575428 1.0 1.0 1.0 0.0 0.0
我想将m1中具有相同材料comabination的订单号组合到m5。
我希望实现类似的数据框:
material plant Order m1 m2 m3 m4 m5
24990 89952 4568789,5098710 1.0 1.0 0.0 0.0 0.0
24990 89952 9448609,1007081 0.0 0.0 1.0 0.0 1.0
166621 3062 18364103 0.0 0.0 0.0 0.0 0.0
166621 3062 78309139 0.0 1.0 0.0 0.0 0.0
240758 3062 55146035 1.0 1.0 1.0 0.0 0.0
276009 3062 38501581,857542 1.0 1.0 1.0 0.0 0.0
我正在尝试类似的事情:
Data frame x
y = x.values
x['new_col'] = y.tolist()
df1 = x['new_col'] df = df1.to_frame()
然后尝试使用' new_col'(m1到m5)进行df1.groupby,但没有得到我想要的。 我必须使用for循环吗? 任何帮助都是值得赞赏的
答案 0 :(得分:1)
我认为所有列都需要groupby
而Order
与join
不同,最后为MultiIndex
和reset_index
的列添加reindex
列的排序:
c = df.columns.difference(['Order']).tolist()
df = (df.groupby(c, sort=False)['Order'].apply(lambda x: ','.join(x.astype(str)))
.reset_index()
.reindex(columns=df.columns))
print (df)
material plant Order m1 m2 m3 m4 m5
0 24990 89952 4568789,5098710 1.0 1.0 0.0 0.0 0.0
1 24990 89952 9448609,1007081 0.0 0.0 1.0 0.0 1.0
2 166621 3062 18364103 0.0 0.0 0.0 0.0 0.0
3 166621 3062 78309139 0.0 1.0 0.0 0.0 0.0
4 240758 3062 55146035 1.0 1.0 1.0 0.0 0.0
5 276009 3062 38501581,38575428 1.0 1.0 1.0 0.0 0.0
类似的解决方案,如果需要list
s:
c = df.columns.difference(['Order']).tolist()
df = (df.groupby(c, sort=False)['Order'].apply(list)
.reset_index()
.reindex(columns=df.columns))
print (df)
material plant Order m1 m2 m3 m4 m5
0 24990 89952 [4568789, 5098710] 1.0 1.0 0.0 0.0 0.0
1 24990 89952 [9448609, 1007081] 0.0 0.0 1.0 0.0 1.0
2 166621 3062 [18364103] 0.0 0.0 0.0 0.0 0.0
3 166621 3062 [78309139] 0.0 1.0 0.0 0.0 0.0
4 240758 3062 [55146035] 1.0 1.0 1.0 0.0 0.0
5 276009 3062 [38501581, 38575428] 1.0 1.0 1.0 0.0 0.0
答案 1 :(得分:1)
这是一种方式。首先定义列,可能使用numpy.r_
来提取必要的列索引。然后groupby
列出并reset_index
。
group_cols = df.columns[np.r_[0:2, 3:len(df.columns)]].tolist()
res = df.groupby(group_cols)['Order'].apply(list).reset_index()
结果:
material plant m1 m2 m3 m4 m5 Order
0 24990 89952 0.0 0.0 1.0 0.0 1.0 [9448609, 1007081]
1 24990 89952 1.0 1.0 0.0 0.0 0.0 [4568789, 5098710]
2 166621 3062 0.0 0.0 0.0 0.0 0.0 [18364103]
3 166621 3062 0.0 1.0 0.0 0.0 0.0 [78309139]
4 240758 3062 1.0 1.0 1.0 0.0 0.0 [55146035]
5 276009 3062 1.0 1.0 1.0 0.0 0.0 [38501581, 38575428]