【问题标题】:Custom variable names when reshaping pandas dataframe from long to wide将 pandas 数据框从长改成宽时的自定义变量名称
【发布时间】:2020-02-10 17:59:00
【问题描述】:

我有以下数据框:

import numpy as np
import pandas as pd
silly = pd.DataFrame({'id':[i for i in range(3) for j in range(3)], 'cat':['a','b','c'] * 3, 'v1':np.random.random(9), 'v2':np.random.random(9)})
print(silly)

   id cat        v1        v2
0   0   a  0.374509  0.211018
1   0   b  0.132380  0.996551
2   0   c  0.194045  0.956656
3   1   a  0.475134  0.892442
4   1   b  0.166790  0.615519
5   1   c  0.285272  0.896530
6   2   a  0.397225  0.147312
7   2   b  0.504841  0.679368
8   2   c  0.595551  0.625830

我需要将此数据从长格式转换为宽格式。为此,我尝试了:

silly_wide = silly.pivot(index='id', columns='cat', values=['v1','v2'])
print(silly_wide)

           v1                            v2                    
cat         a         b         c         a         b         c
id                                                             
0    0.374509  0.132380  0.194045  0.211018  0.996551  0.956656
1    0.475134  0.166790  0.285272  0.892442  0.615519  0.896530
2    0.397225  0.504841  0.595551  0.147312  0.679368  0.625830

这可行,但我需要“展平”列名以获得自定义列名。期望的结果应该是这样的:

id         v1a       v1b       v1c       v2a       v2b       v2c                                                            
 0    0.374509  0.132380  0.194045  0.211018  0.996551  0.956656
 1    0.475134  0.166790  0.285272  0.892442  0.615519  0.896530
 2    0.397225  0.504841  0.595551  0.147312  0.679368  0.625830

pandas.DataFrame.pivot() 中是否有参数可以提供帮助?不然怎么办?

【问题讨论】:

  • 添加valuessilly_wide = silly.pivot(index='id', columns='cat', values='value')
  • silly.pivot(index='id', columns='cat', values='value').rename_axis(None, axis=1)silly_wide.columns = silly_wide.columns.to_series().str.join('_')
  • @ZarakiKenpachi 虽然我没有完全理解代码,但我相信.strip() 是多余的。我也没有意识到这实际上被称为“扁平化索引”。

标签: python pandas dataframe pivot reshape


【解决方案1】:
>>> silly.pivot(values='value', columns='cat', index='id').add_prefix('value_')
cat   value_a   value_b   value_c
id                               
0    0.207024  0.412420  0.001094
1    0.990861  0.386278  0.092327
2    0.093256  0.984317  0.721615

使用多值列的修改数据,您可以使用列表推导来连接列名称中的不同级别:

silly_wide = silly.pivot(values=['v1', 'v2'], columns='cat', index='id')
silly_wide.columns = [''.join(col) for col in silly_wide.columns]
>>> silly_wide
         v1a       v1b       v1c       v2a       v2b       v2c
id                                                            
0   0.625485  0.846527  0.987203  0.261629  0.767406  0.138268
1   0.305565  0.151946  0.687424  0.460385  0.825205  0.768997
2   0.327507  0.215792  0.796235  0.018233  0.734781  0.423353

【讨论】:

【解决方案2】:

来自pyjanitorpivot_wider 可能有助于作为从长到宽重塑的抽象(它是pd.pivot 的包装器):

# pip install pyjanitor
import pandas as pd
import janitor as jn
df.pivot_wider(index='id', names_from='cat', names_sep="")
 
   id       v1a       v1b       v1c       v2a       v2b       v2c
0   0  0.374509  0.132380  0.194045  0.211018  0.996551  0.956656
1   1  0.475134  0.166790  0.285272  0.892442  0.615519  0.896530
2   2  0.397225  0.504841  0.595551  0.147312  0.679368  0.625830

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多