Панды: условная нарезка после группового среднего - PullRequest
0 голосов
/ 28 февраля 2019

Это, должно быть, задавали раньше, но я не мог найти решение - извините, если дубликат!Я сгруппировал по месяцам и годам блок данных с индексом даты и времени (называемый «время») и применил среднее значение df = df.groupby([df.index.year, df.index.month]).mean(), которое дало следующее:

               0
time    time    

2000    1   0.245888
    2   0.579210
    3   0.519101
    4   1.724130
    5   2.909998
    6   6.754044
    7   5.654214
    8   0.972300
    9   0.207180
    10  -0.608038
    11  -2.271975
    12  -9.407542
2001    1   -4.206406
    2   0.339256
    3   2.447668
    4   2.159161
    5   2.014476
    6   4.495522
    7   2.130116
    8   4.280266
    9   2.329842
    10  -1.560461
    11  -2.232722
    12  -2.182392

У него есть 2 индекса, оба из которых называются «время»., соответствующий году и месяцу.Теперь я хочу нарезать по месяцам (создать новый фрейм данных с месяцем = 1 или месяцем от 6 до 8 и т. Д.), Но я не уверен, как сделать операцию над этим.

Я хочу сделать что-то вроде:

df.loc[(df.index.month == 1)]
df.loc[(df.index.month == 1) | (df.index.month == 2)]
df.loc[(df.index.month >= 1) & (df.index.month <= 6)]

и т. Д.

При этом получается AttributeError: 'MultiIndex' object has no attribute 'month' (понятно).Я попытался переименовать индекс с df.rename(['year', 'month']), что дает AttributeError list object is not callable.Я подумал, что, возможно, мне нужно сбросить индекс, чтобы он снова был в формате datetime, но df.reset_index() дает ValueError cannot insert time.

df.index дает:

MultiIndex(levels=[[2000, 2001], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
           codes=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]],
           names=['time', 'time'])

Редактировать - 1. Отредактировано, чтобы сказать, что я хочу более гибкую операцию нарезки, а не просто получить конкретный месяц.2. Оригинал df выглядел так:

             0
time    
2000-01-01  1.427332
2000-01-02  1.468405
2000-01-03  1.525916
2000-01-04  1.399915
2000-01-05  1.192117
2000-01-06  1.191234
2000-01-07  1.431109
2000-01-08  1.687709
2000-01-09  1.876527
2000-01-10  1.871062
2000-01-11  1.759002
2000-01-12  1.553009
2000-01-13  1.336487
2000-01-14  1.105376
2000-01-15  0.732866
2000-01-16  0.259119
2000-01-17  -0.003458
2000-01-18  -0.180170
2000-01-19  -0.275862
2000-01-20  -0.580456
2000-01-21  -0.800049
2000-01-22  -0.990277
2000-01-23  -1.139482
2000-01-24  -1.264528
2000-01-25  -1.378858
2000-01-26  -1.516954
2000-01-27  -1.394427
2000-01-28  -1.371782
2000-01-29  -1.337087
2000-01-30  -1.120146
... ...
2001-12-02  -4.521928
2001-12-03  -4.499393
2001-12-04  -4.425628
2001-12-05  -4.270720
2001-12-06  -4.286983
2001-12-07  -4.141410
2001-12-08  -3.886460
2001-12-09  -4.008633
2001-12-10  -3.772096
2001-12-11  -3.261724
2001-12-12  -3.271314
2001-12-13  -3.306891
2001-12-14  -3.111070
2001-12-15  -2.694092
2001-12-16  -2.063524
2001-12-17  -1.593670
2001-12-18  -1.279061
2001-12-19  -0.957185
2001-12-20  -0.616801
2001-12-21  -0.316757
2001-12-22  -0.292797
2001-12-23  -0.226818
2001-12-24  -0.196901
2001-12-25  -0.237203
2001-12-26  -0.221769
2001-12-27  -0.167911
2001-12-28  -0.050808
2001-12-29  -0.044765
2001-12-30  -0.384740
2001-12-31  -0.913277
730 rows × 1 columns

1 Ответ

0 голосов
/ 28 февраля 2019

Сначала возможно использование rename:

df = df.groupby([df.index.year.rename('year'), 
                 df.index.month.rename('month')]).mean()

Или rename_axis для набора MultiIndex имен:

df = df.groupby([df.index.year, df.index.month]).mean().rename_axis(('year','month'))

Для выбора использования DataFrame.xs:

df1 = df.xs(1, axis=0, level=1)

Если вам нужен фильтр, как в вашем решении, необходимо get_level_values для выбора второго уровня:

df.loc[(df.index.get_level_values(1) == 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...