Невозможно добавить итоговый столбец в существующий индексированный фрейм данных - PullRequest
1 голос
/ 09 марта 2019

Я новичок в 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 * 1011 это не работает*

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 не более ровный, в настоящее время он сгруппирован, и я хочу добавить общеезначения точно на уровне "месяца".

Я был бы очень счастлив, даже если бы кто-то дал мне знать, как Google это!

1 Ответ

1 голос
/ 09 марта 2019

Это связано с тем, что столбец «месяц» в данных о рейсе имеет тип 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)

Здесь - дополнительная информация о 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...