Pandas добавление строки в категориальный индекс - PullRequest
0 голосов
/ 30 января 2020

У меня есть сценарий, в котором я хотел бы сгруппировать свои наборы данных по индивидуально определенным недельным индексам, которые затем усредняются и агрегируют средние значения в строку «Всего». Я могу достичь первой половины моего сценария, но когда я пытаюсь добавить / вставить новую строку «Всего», которая суммирует эти строки, я получаю сообщения об ошибках.

Я попытался создать эту строку с помощью двух различные методы:

Метод 1:

week_index_avg_unit.loc['Total'] = week_index_avg_unit.sum()

TypeError: cannot append a non-category item to a CategoricalIndex

Метод 2:

week_index_avg_unit.index.insert(['Total'], week_index_avg_unit.sum())

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Я использовал первый подходить к этому сценарию несколько раз, но это первый раз, когда я разбиваю данные на несколько категорий и четко вижу, в чем проблема типа CategoricalIndex.

Вот формат мои данные:

  date  organic  ppc   oa  other  content_partnership  total  \
0  2018-01-01      379  251  197     51                    0    878   
1  2018-01-02      880  527  405    217                    0   2029   
2  2018-01-03      859  589  403    323                    0   2174   
3  2018-01-04      835  533  409    335                    0   2112   
4  2018-01-05      760  449  355    272                    0   1836   

  year_month  day  weekday weekday_name week_index  
0    2018-01    1        0       Monday     Week 1  
1    2018-01    2        1      Tuesday     Week 1  
2    2018-01    3        2    Wednesday     Week 1  
3    2018-01    4        3     Thursday     Week 1  
4    2018-01    5        4       Friday     Week 1  

Вот код:

import pandas as pd
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
historicals = pd.read_csv("2018-2019_plants.csv")

# Capture dates for additional date columns
date_col = pd.to_datetime(historicals['date'])

historicals['year_month'] = date_col.dt.strftime("%Y-%m")
historicals['day'] = date_col.dt.day
historicals['weekday'] = date_col.dt.dayofweek
historicals['weekday_name'] = date_col.dt.day_name()

# create week ranges segment (7 day range)
historicals['week_index'] = pd.cut(historicals['day'],[0,7,14,21,28,32], labels=['Week 1','Week 2','Week 3','Week 4','Week 5'])

# Week Index Average (Units)
week_index_avg_unit = historicals[df_monthly_average].groupby(['week_index']).mean().astype(int)

type(week_index_avg_unit.index)
pandas.core.indexes.category.CategoricalIndex

Вот таблица week_index_avg_unit:

organic  ppc   oa  other  content_partnership  total  day  weekday
week_index                                                                    
Week 1          755  361  505    405                   22   2027    4        3
Week 2          787  360  473    337                   19   1959   11        3
Week 3          781  382  490    352                   18   2006   18        3
...

1 Ответ

0 голосов
/ 31 января 2020

pd.CategoricalIndex - особенное животное. Он неизменен, поэтому для выполнения трюка вам может понадобиться что-то вроде pd.CategoricalIndex.set_categories, чтобы добавить новую категорию. См. pandas документы: https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.CategoricalIndex.html

...