编程语言
首页 > 编程语言> > python – 如何转置pandas数据帧以交叉制表保存所有值的数据帧

python – 如何转置pandas数据帧以交叉制表保存所有值的数据帧

作者:互联网

我们假设我们有这样的数据帧:

df = pd.DataFrame({'key' : ['one', 'two', 'three', 'four'] * 3,
                   'col' : ['A', 'B', 'C'] * 4,
                   'val1' : np.random.randn(12),
                   'val2' : np.random.randn(12),
                   'val3' : np.random.randn(12)})

key col是唯一的密钥

dataframe

我想使col值成为拆分列或交叉列表,最后看起来像这样:

enter image description here

第一个天真的方法pd.crosstab(df.key,df.col)在这里工作不好:

enter image description here

此代码pd.crosstab(df.key,df.col,values = df [[‘val1′,’val2′,’val3’]],aggfunc = np.max)无法使用ValueError运行:传递的项目数错误3,安置意味着1

怎么运作?

解决方法:

使用pivot_tableswaplevelsort_index以及聚合函数np.max:

df = (df.pivot_table(index='key', columns='col', aggfunc=np.max)
       .swaplevel(0,1,axis=1)
       .sort_index(axis=1))

替代方案是在GroupBy.max之前汇总:

df = (df.groupby(['key', 'col'])
        .max()
        .unstack()
        .swaplevel(0,1,axis=1)
        .sort_index(axis=1))
print (df)
col           A                             B                             C  \
           val1      val2      val3      val1      val2      val3      val1   
key                                                                           
four  -0.225967  0.362041  0.040915 -1.227718 -0.879248 -1.279912 -1.577218   
one   -0.187167  1.530731 -1.112116 -0.871077 -2.099876 -0.069297 -0.351971   
three -0.165375 -0.378049 -0.390724  0.484519 -0.408990 -1.496042  0.590083   
two    1.923084 -0.688284  1.702659 -0.159921  0.635245  0.623821 -1.503893   

col                        
           val2      val3  
key                        
four  -1.135872  0.645371  
one    2.347472  0.129252  
three  0.402825  0.883710  
two   -0.132847  0.179476  

标签:python,dataframe,pandas,crosstab
来源: https://codeday.me/bug/20190722/1499944.html