目标:
我想转换以下架构:
group, id, name
A, 12345, "eeny"
A, 23456, "meeny"
A, 34567, "miney mo"
B, 99999, "foo"
B, 88888, "bar"
B, 77777, "foobar"
成:
group, id1, name1, id2, name2, id3, name3
A, 12345, "eeny", 23456, "meeny", 34567, "miney mo"
B, 99999, "foo", 88888, "bar", 77777, "foobar"
在Python的上下文中,我假设可以使用Pandas groupby()和/或unstack()来完成,但我遇到的大多数文档都与数值计算有关而不是字符串。
非常感谢任何帮助。谢谢!
答案 0 :(得分:5)
这是一种方式。在每个组中添加一个表示计数的列。
df['group_num'] = df.groupby('group')['id'].transform(lambda x: range(1, len(x)+1))
然后,使用pivot
函数重塑数据。
In [37]: df.pivot(index='group', columns='group_num')
Out[37]:
id name
group_num 1 2 3 1 2 3
group
A 12345 23456 34567 eeny meeny miney mo
B 99999 88888 77777 foo bar foobar
这会将列设置为MultiIndex。当您在所需的输出中显示时,您可以将其展平:
In [41]: df = df.pivot(index='group', columns='group_num')
In [42]: df.columns = [''.join([lvl1, str(lvl2)]) for lvl1, lvl2 in df.columns]
In [43]: df
Out[43]:
id1 id2 id3 name1 name2 name3
group
A 12345 23456 34567 eeny meeny miney mo
B 99999 88888 77777 foo bar foobar