【问题标题】:Python DataFrame: transpose one column into multiple columnPython DataFrame:将一列转置为多列
【发布时间】:2018-03-09 12:27:28
【问题描述】:

我有一个如下的数据框:

df = pd.DataFrame({'month':['2017-09-27','2017-09-27','2017-09-28','2017-09-29'],'Cost':[100,500,200,300]})

我怎样才能得到这样的df:

2017-09-27   2017-09-28    2017-09-29
  100            200          300
  500            NULL         NULL  

提前致谢!

【问题讨论】:

    标签: python-3.x pandas dataframe reshape


    【解决方案1】:

    使用cumcount 计算items within each group 的“累积计数”。我们将使用这些值(如下)作为索引标签。

    In [97]: df['index'] = df.groupby('month').cumcount()
    
    In [98]: df
    Out[98]: 
       Cost       month  index
    0   100  2017-09-27      0
    1   500  2017-09-27      1
    2   200  2017-09-28      0
    3   300  2017-09-29      0
    

    那么pivoting就可以得到想要的结果:

    In [99]: df.pivot(index='index', columns='month', values='Cost')
    Out[99]: 
    month  2017-09-27  2017-09-28  2017-09-29
    index                                    
    0           100.0       200.0       300.0
    1           500.0         NaN         NaN
    

    【讨论】:

    • 我喜欢你的回答。谢谢!
    • 我的意思是我知道 cumcount,但为什么我没有想到这个解决方案:(。你有一些文章或书籍推荐我阅读吗?谢谢!
    • 很好的答案!我在这个概念的衍生解决方案中使用了cumcount
    • 我不知道有哪本书涵盖了这一点;在很大程度上,我认为学习这些技巧只是经验问题。每次你看到新的东西时,学习技巧并振作起来:它们的数量是有限的 :) PS。在 StackOverflow 上闲逛并尝试回答问题是学习一门学科的好方法。
    • @ZedFang:我确定我不是第一个想到这个的人,但this post 记录了我是如何偶然发现这个技巧的。
    【解决方案2】:

    选项1
    zip_longest

    from itertools import zip_longest
    
    s = df.groupby('month').Cost.apply(list)
    pd.DataFrame(list(zip_longest(*s)), columns=s.index)
    
    month  2017-09-27  2017-09-28  2017-09-29
    0             100       200.0       300.0
    1             500         NaN         NaN
    

    选项 2
    pd.concat

    pd.concat(
        {k: g.reset_index(drop=True) for k, g in df.groupby('month').Cost},
        axis=1
    )
    
       2017-09-27  2017-09-28  2017-09-29
    0         100       200.0       300.0
    1         500         NaN         NaN
    

    选项 3
    与@unutbu 类似,它使用cumcount。但是,我使用 set_indexunstack 进行旋转。

    df.set_index([df.groupby('month').cumcount(), 'month']).Cost.unstack()
    
    month  2017-09-27  2017-09-28  2017-09-29
    0           100.0       200.0       300.0
    1           500.0         NaN         NaN
    

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 2017-02-20
      • 2023-01-14
      • 2016-12-01
      • 1970-01-01
      • 2019-06-22
      • 2013-06-03
      • 2016-11-17
      相关资源
      最近更新 更多