将列值转换为行并根据另一列的值将它们分组

时间:2018-08-07 11:24:35

标签: python pandas pandas-groupby

我有一个看起来像这样的数据框:

Value     group_id
23        1
28        1
32        1 
....
35        12
23        12
42        12

共有6个唯一的group_id,每个都有数百个元素。 我想将其转换为在一行中具有单个' group_id '的 value 的数据框。所以我希望我的数据框看起来像这样:

value_1 value_2 value_3 group_id
23       28      32      1
....
35       23      42      12

我尝试使用pandas.melt和pandas.groupby,但未获得任何结果。

2 个答案:

答案 0 :(得分:3)

您缺少每个组中'Value'的位置。我们可以使用groupby.cumcount

创建它
df.set_index(
    ['group_id', df.groupby('group_id').cumcount() + 1]
).Value.unstack().add_prefix('Value_').reset_index()

   group_id  Value_1  Value_2  Value_3
0         1       23       28       32
1        12       35       23       42

答案 1 :(得分:2)

groupbycumcount配合使用来填写您的'value_'记录,然后对结果使用.pivot_table

df['val_grp'] = 'value_' + (df.groupby('group_id').cumcount() + 1).astype(str)

pvt = df.pivot_table(index='group_id', columns='val_grp', values='Value')

print(pvt)

打印:

val_grp   value_1  value_2  value_3
group_id                           
1              23       28       32
12             35       23       42

如andrew_reece的评论中所述,可以通过以下操作在一行中完成:

pvt = df.assign(idx=(df.groupby("group_id").cumcount()+1).astype(str).str.replace("^(.)", "value_\\1", regex=True)).pivot(index="group_id", columns="idx", values="Value")

但是,应该注意的是,这要求熊猫23.0或更高版本,因为这是引入regex的{​​{1}}参数的时候。