numpy 使用Pandas pivot_table且margins=True时出错

osh3o9ms  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(284)

我的代码(摘自Python Data Science Handbook(O'Reilly)):

  • 完全披露:在撰写本文时,这本书仍处于早期发行阶段,这意味着它仍然未经编辑,处于原始状态。
import numpy as np
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset('titanic')

titanic.pivot_table('survived', index='sex', columns='class')

结果是:

但是,如果我现在尝试使用margins关键字添加总计,则会发生以下错误:

titanic.pivot_table('survived', index='sex', columns='class', margins=True)

TypeError: cannot insert an item into a CategoricalIndex that is not already an existing category

知道是什么导致的吗
版本信息:

  • 简体中文
  • pandas 0.16.2
  • numpy 1.9.2
jum4pzuy

jum4pzuy1#

这似乎是由于Pandas0.15和0.16之间的变化所致。在以前的版本中,titanic数据集具有以下dtype:

In [1]: import pandas, seaborn

In [2]: pandas.__version__
'0.15.2'

In [3]: titanic = seaborn.load_dataset('titanic')

In [4]: titanic.dtypes
Out[4]: 
survived         int64
pclass           int64
sex             object
age            float64
sibsp            int64
parch            int64
fare           float64
embarked        object
class           object
who             object
adult_male        bool
deck            object
embark_town     object
alive           object
alone             bool
dtype: object

关于Pandas:

In [1]: import pandas, seaborn

In [2]: pandas.__version__
'0.16.2'

In [3]: titanic = seaborn.load_dataset('titanic')

In [4]: titanic.dtypes
Out[4]: 
survived          int64
pclass            int64
sex              object
age             float64
sibsp             int64
parch             int64
fare            float64
embarked         object
class          category
who              object
adult_male         bool
deck           category
embark_town      object
alive            object
alone              bool
dtype: object

有几个列被自动转换为分类列,这就产生了这个bug。该书目前尚未出版和编辑;我一定会用最新的版本进行测试,并在发布之前修复这些类型的错误。
现在,这里有一个解决方案:

In [5]: titanic['class'] = titanic['class'].astype(object)

In [6]: titanic.pivot_table('survived', index='sex', columns='class', margins=True)
Out[6]: 
class      First    Second     Third       All
sex                                           
female  0.968085  0.921053  0.500000  0.742038
male    0.368852  0.157407  0.135447  0.188908
All     0.629630  0.472826  0.242363  0.383838

编辑:我把这个作为一个问题提交给了Pandas项目:https://github.com/pydata/pandas/issues/10989

mwecs4sa

mwecs4sa2#

pivot_tables创建一个新的DataFrame,因此需要一个新的变量new_var = titanic.pivot_table(...)
(...,margins = True)是每一列和每一行的平均值(bool或int)
只需del(...,margins = True)并使用.aggfunc = sum)

相关问题