【问题标题】:Flatten and expand a csv file?展平和展开 csv 文件?
【发布时间】:2014-11-09 11:08:18
【问题描述】:

目标:

我想转换以下架构:

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

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: python csv pandas flatten


    【解决方案1】:

    这是一种方法。添加表示每个组内计数的列。

    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
    

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 2017-07-28
      • 2012-05-23
      • 1970-01-01
      • 2022-10-07
      • 2021-04-19
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多