Group by / Aggregate Pandas Dataframe

时间:2018-03-29 12:54:54

标签: python pandas group-by

我有一个数据框,如:

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循环吗?    任何帮助都是值得赞赏的

2 个答案:

答案 0 :(得分:1)

我认为所有列都需要groupbyOrderjoin不同,最后为MultiIndexreset_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]