python - 向 pandas DataFrame 添加新列时引发 TypeError

标签 python pandas dataframe typeerror

我一直在观看有关使用 Python 进行数据分析的在线类(class)。当我完全按照教练的做法进行操作时,我遇到了一个问题。基本上,我从seaborn中提取了一个名为“flights”的数据框,并设置了索引“year”和“month”并将其拆开。使用以下代码:

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

the final data frame is like this

然后我尝试使用以下代码在每年的总和末尾添加一个名为“Total”的新列:

flights_unstacked["passengers"]["Total"] = flights_unstacked.sum(axis = 1)

但它引发了 TypeError: 无法将项目插入尚不存在的类别的 CategoricalIndex。

我是使用 pandas 进行数据操作的新手。谁能告诉我如何解决这个问题?这是版本问题吗,因为网上老师做了一模一样的事情,但他的作品很好。 PS:我使用Python 2.7和pandas 0.20.3。

最佳答案

seaborn.load_dataset 行将 month 列检测为 category 数据类型。要解决此错误,请将 categorical 转换为 str,并在 flights = seaborn.load_dataset("flights") 之后使用此行:

flights["month"] = flights["month"].astype(str)

要按时间顺序对月份字符串进行排序,请首先删除 flights_unstacked 列的顶层 (level=0)(该级别保存单个值 passengers) :

import seaborn
import pandas as pd

flights = seaborn.load_dataset("flights")
flights["month"] = flights["month"].astype(str)

flights_indexed = flights.set_index(["year", "month"])
flights_unstacked = flights_indexed.unstack()
flights_unstacked.columns = flights_unstacked.columns.droplevel(0)

然后根据您按时间顺序预先构建的月份字符串列表重新索引月份字符串列:

import calendar
months = [calendar.month_name[i] for i in range(1, 13)]
flights_unstacked = flights_unstacked[months]

最后,您可以添加一列总计:

flights_unstacked["Total"] = flights_unstacked.sum(axis=1)

结果:

In [329]: flights_unstacked
Out[329]:
month  January  February  March  April  May  June  July  August  September  October  November  December  Total
year                                                                                                          
1949       112       118    132    129  121   135   148     148        136      119       104       118   1520
1950       115       126    141    135  125   149   170     170        158      133       114       140   1676
1951       145       150    178    163  172   178   199     199        184      162       146       166   2042
1952       171       180    193    181  183   218   230     242        209      191       172       194   2364
1953       196       196    236    235  229   243   264     272        237      211       180       201   2700
1954       204       188    235    227  234   264   302     293        259      229       203       229   2867
1955       242       233    267    269  270   315   364     347        312      274       237       278   3408
1956       284       277    317    313  318   374   413     405        355      306       271       306   3939
1957       315       301    356    348  355   422   465     467        404      347       305       336   4421
1958       340       318    362    348  363   435   491     505        404      359       310       337   4572
1959       360       342    406    396  420   472   548     559        463      407       362       405   5140
1960       417       391    419    461  472   535   622     606        508      461       390       432   5714

关于python - 向 pandas DataFrame 添加新列时引发 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253723/

相关文章:

python - 将列表添加为 pandas Dataframe 中的值

python - 如果将 bool 类型设为假值,则无法使用elasticsearch dsl创建文档

python - 使用请求Python获取sessionId

python - 从 Pandas 系列中,创建以唯一元素作为键、其索引作为值的字典

python - 在 Pandas 中处理日期 - 删除日期时间中看不见的字符并转换为字符串

python - 将 NumPy 数组与 pandas DataFrame 连接(加入)

Pandas DataFrames 在 Spyder 4 中与新的对象资源管理器一起显示

python - 基于Multiindex和dataframe创建MultiIndex Dataframe(比较矩阵)

python - 直接抓取数据到 Cassandra 数据库

python - MySQL返回的数据类型和python为不同的函数输出不同的类型