展平并展开csv文件?

时间:2014-09-15 20:19:21

标签: python csv pandas flatten

目标:

我想转换以下架构:

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()来完成,但我遇到的大多数文档都与数值计算有关而不是字符串。

非常感谢任何帮助。谢谢!

1 个答案:

答案 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