У меня есть 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
Как изменить значения в этих срезах моего фреймворка?
Я думаю, что нужно только фильтровать:
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
Я считаю, что вы можете сделать:
df.loc[(1923, 'foo'), 'count'] = 3
Может также использовать 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)]
.loc
не работал таким образом, извините, и проголосовал за путаницу