我是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();
在该示例中,以下行应该有效,但在python3中不起作用
flights_unstacked['passengers','total'] = flights_unstacked.sum(axis=1)
我发现了一些链接,这些链接显示了如何添加列(link1,link2),但是这些都不适合我
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不再完全平坦,它已经被分组,并且我想将总计值精确地添加到“月”级别。
即使有人让我知道如何搜索它,我也会非常高兴!
答案 0 :(得分:1)
这是因为航班数据中的“月”列的类型为category
。因此,将其拆开后,它会创建一个pd.CategoricalIndex
,并且'total'不是有效的类别之一。
最快和最简单的解决方法是将该列强制转换为类型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
数据的更多信息。
如何在维护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)