目标:
我想转换以下架构:
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() 来完成,但我遇到的大多数文档都涉及数值计算而不是字符串。
任何帮助将不胜感激。谢谢!
最佳答案
这是一种方法。添加一列表示每个组内的计数。
df['group_num'] = df.groupby('group')['id'].transform(lambda x: range(1, len(x)+1))
然后,使用pivot
函数 reshape 数据。
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
这会将列设置为多重索引。您可以在所需的输出中显示如下所示的扁平化:
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
关于python - 压平并展开 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25856253/