Значения не устанавливаются на слайсе с помощью .xs () и .get_level_values ()

1

У меня есть DataFrame MultiIndex, который выглядит так:

                    count

   year   item
   1922   foo       0
          bar       0
   1923   foo       0
          bar       0
   1924   foo       0
          bar       0

Я пытаюсь установить значения в течение нескольких лет и некоторые элементы, нарезая .get_level_values() с помощью .get_level_values() и .xs(). Например:

lst = [1923, 1924]

df[df.index.get_level_values('year').isin(lst)].xs('foo', level=1).loc[:, 'count'] = 3

Это не вызывает никаких ошибок, но значение остается 0:

In: df[df.index.get_level_values('year').isin(lst)].xs('foo', level=1)
Out: 

       count
year
1923   0
1924   0

Как изменить значения в этих срезах моего фреймворка?

Теги:
pandas

3 ответа

2
Лучший ответ

Я думаю, что нужно только фильтровать:

lst = [1923, 1924]

m1 = df.index.get_level_values('year').isin(lst)
m2 = df.index.get_level_values('item') == 'foo'

df.loc[m1 & m2, 'count'] = 3
print (df)
           count
year item       
1922 foo       0
     bar       0
1923 foo       3
     bar       0
1924 foo       3
     bar       0
1

Я считаю, что вы можете сделать:

df.loc[(1923, 'foo'), 'count'] = 3
  • 0
    Вы знаете, что, я упростил мой примерный вопрос, мне действительно нужно выбирать из нескольких лет, чтобы .loc не работал таким образом, извините, и проголосовал за путаницу
0

Может также использовать product и loc в вашем случае

a = itertools.product(lst, ['foo'])
df.loc[a, 'count'] = 3

Проблема с

df[df.index.get_level_values('year').isin(lst)].xs('foo', level=1).loc[:, 'count'] = 3

что вы меняете копию, возвращенную с df[df.index.get_level_values('year').isin(lst)]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню