无法将总计列添加到现有的Indexed DataFrame中

时间:2019-03-09 15:26:09

标签: python python-3.x pandas dataframe

我是Python的新手,目前正尝试从书本和课程中重复示例。在所有情况下,我都在为DataFrame结构而苦苦挣扎,似乎它已经从2.7变为3.0了

基本上,在当前示例中,我想添加总计列(每年总计)。所以我做了以下

import pandas as pd
import seaborn
flights = seaborn.load_dataset('flights')
flights_indexed = flights.set_index(['year','month'])
flights_unstacked = flights_indexed.unstack();

enter image description here

在该示例中,以下行应该有效,但在python3中不起作用

flights_unstacked['passengers','total'] = flights_unstacked.sum(axis=1)

我发现了一些链接,这些链接显示了如何添加列(link1link2),但是这些都不适合我

flights_unstacked["passengers"].insert(loc=0,column="total", value=flights_unstacked.sum(axis=1).values)

在两种情况下,错误都是相同的cannot insert an item into a CategoricalIndex that is not already an existing category

我感觉到它一定比较棘手,因为我的DataFrame不再完全平坦,它已经被分组,并且我想将总计值精确地添加到“月”级别。

即使有人让我知道如何搜索它,我也会非常高兴!

1 个答案:

答案 0 :(得分:1)

这是因为航班数据中的“月”列的类型为category。因此,将其拆开后,它会创建一个pd.CategoricalIndex,并且'total'不是有效的类别之一。

解决方案1 ​​

最快和最简单的解决方法是将该列强制转换为类型object

import pandas as pd
import seaborn
flights = seaborn.load_dataset('flights')

# Casting here
flights['month'] =  flights.month.astype('O')

# Should work as intended now
flights_indexed = flights.set_index(['year','month'])
flights_unstacked = flights_indexed.unstack()
flights_unstacked['passengers','total'] = flights_unstacked.sum(axis=1)

Here是有关categorical数据的更多信息。


解决方案2

如何在维护categorical数据类型的同时处理此问题。

import pandas as pd
import seaborn
flights = seaborn.load_dataset('flights')

flights.month.dtype

此字段的类别显示为...

CategoricalDtype(categories=['January', 'February', 'March', 'April', 'May', 'June',
                  'July', 'August', 'September', 'October', 'November',
                  'December'],
                 ordered=False)

在这种情况下,您可以看到12个类别,即“一月” ..“十二月”。

您可以使用以下方法添加其他类别:

flights.month.cat.add_categories('total', inplace=True)

然后再次检查类别...

flights.month.dtype

CategoricalDtype(categories=['January', 'February', 'March', 'April', 'May', 'June',
                  'July', 'August', 'September', 'October', 'November',
                  'December', 'total'],
                 ordered=False)

“总计”已添加为有效类别。

以下内容现在应该可以工作:

flights_indexed = flights.set_index(['year','month'])
flights_unstacked = flights_indexed.unstack()
flights_unstacked['passengers','total'] = flights_unstacked.sum(axis=1)