我有一个看起来像这样的数据框:
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,但未获得任何结果。
答案 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)
将groupby
与cumcount
配合使用来填写您的'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}}参数的时候。