Установка значений столбца Multiindex на основе его индекса - PullRequest
1 голос
/ 11 марта 2020

Это мой мультииндексный фрейм данных:

                        A   B   C   D   E   F     G   H    I    J
Chars  Date
       2020 January   4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 February  4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 March     4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 April     4.0  66  45  26  99  20  13.5  15  3.8  3.2
Chars2 2020 January   4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 February  4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 March     4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 April     4.0  66  45  26  99  20  13.5  15  3.8  3.2

Например, я хочу внести изменения в марте и после марта, но только в столбце «B». Как я могу это сделать?

Я пытался:

df.xs('Chars2')[df['B'].index.get_level_values(1).month >= 3] = 20.40

Я получил эту ошибку:

AttributeError: 'Index' object has no attribute 'month'

И затем я попробовал что-то подобное. Но я не смог достичь желаемого результата.

df.loc[pd.IndexSlice['B', pd.to_datetime(df.index.get_level_values(1), errors = 'coerce').month >= 3] = 20.40

Мой ожидаемый результат:

                        A   B   C   D   E   F     G   H    I    J
Chars  Date
       2020 January   4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 February  4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 March     4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 April     4.0  66  45  26  99  20  13.5  15  3.8  3.2
Chars2 2020 January   4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 February  4.0  66  45  26  99  20  13.5  15  3.8  3.2
       2020 March     4.0 20.4 45  26  99  20  13.5  15  3.8  3.2
       2020 April     4.0 20.4 45  26  99  20  13.5  15  3.8  3.2

1 Ответ

0 голосов
/ 11 марта 2020

Создайте 2 маски, объедините их в цепочку с помощью & для побитового И и затем установите значения B:

m1 = pd.to_datetime(df.index.get_level_values(1), errors = 'coerce').month >= 3
m2 = df.index.get_level_values(0) == 'Chars2'

df.loc[m1 & m2, 'B'] = 20.54
print (df)
                        A      B   C   D   E   F     G   H    I    J
Ch     Date                                                         
Chars  2020 January   4.0  66.00  45  26  99  20  13.5  15  3.8  3.2
       2020 February  4.0  66.00  45  26  99  20  13.5  15  3.8  3.2
       2020 March     4.0  66.00  45  26  99  20  13.5  15  3.8  3.2
       2020 April     4.0  66.00  45  26  99  20  13.5  15  3.8  3.2
Chars2 2020 January   4.0  66.00  45  26  99  20  13.5  15  3.8  3.2
       2020 February  4.0  66.00  45  26  99  20  13.5  15  3.8  3.2
       2020 March     4.0  20.54  45  26  99  20  13.5  15  3.8  3.2
       2020 April     4.0  20.54  45  26  99  20  13.5  15  3.8  3.2
...