pandas将表值转换为列或索引

时间:2016-03-14 21:12:24

标签: pandas

如何使用'值'中使用的相同列。对于'列'或者'索引'?

例如:

pd.pivot_table(data, values='Survived', index=['Survived', 'Sex', 'Pclass'],
               aggfunc=len, margins=True)

值和索引使用相同的列Survived。当我尝试运行以上内容时,我得到了

ValueError: Grouper for 'Survived' not 1-dimensional

然而,如果不是值='幸存'我使用另一列,pivot_table工作正常。

1 个答案:

答案 0 :(得分:0)

我看到的一个问题是您在调用columns时没有设置pivot_table参数(它告诉熊猫哪些值用作pivot_table输出的列标题) )。

数据透视表操作实际上是groupby -> aggregate -> unstack的继承。假设您有这个DataFrame

    survived sex pclass  other
0      False   f      a     29
1       True   f      b      6
2       True   f      b     22
3      False   m      b     55
4      False   f      a     59
..       ...  ..    ...    ...
95     False   f      a     66
96     False   f      c     42
97      True   m      c     93
98      True   m      c     59
99     False   f      b     93

您可以使用pivot_table旋转此表:

pd.pivot_table(df, index='sex', columns='pclass', values='other', aggfunc=sum)
pclass     a    b     c
sex                    
f       1000  840   306
m        728  851  1247

或者您可以使用groupbyunstack获得相同的结果:

df.groupby(['sex', 'pclass'])['other'].sum().unstack()
pclass     a    b     c
sex                    
f       1000  840   306
m        728  851  1247

这个简短的故事的重点是数据透视表实际上是groupby操作。在您的情况下,您尝试按['Survived', 'Sex', 'Pclass']分组并再次使用'Survived'聚合len。因为'Survived'已经是输出表索引的一部分,所以这没有多大意义(这就是pivot_table给您错误的原因)。

如果您确实想完成这项工作,可以使用groupby代替:

df.groupby(['survived', 'sex', 'pclass', 'other']['survived'].apply(len).unstack()

但是,我认为您实际上是想实现其他目标,但是不确定。