Панды обновляют значения в мультииндексном фрейме данных - PullRequest
0 голосов
/ 24 апреля 2018

Как я могу редактировать значения многоиндексного фрейма данных? Если бы это был не мультииндексный фрейм данных, я знаю, что мог бы сделать это: df.at[0,'foo'] = 12.3. Также это не работает: df.loc[0]['foo']['a'] = 12.3.

Рассмотрим мульти-индексный столбец данных.

colnames = [['foo', 'foo', 'foo', 'po', 'po', 'po', 'di', 'di', 'di'], ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']]

df = pd.DataFrame(columns=colnames,index=arange(5))

display(df) foo po di<br> a b c a b c a b c 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN NaN NaN NaN NaN NaN

1 Ответ

0 голосов
/ 24 апреля 2018

Используйте tuple s для выбора MultiIndex в столбцах:

df.loc[0, ('foo','a')] = 12.3
print (df)
    foo             po             di          
      a    b    c    a    b    c    a    b    c
0  12.3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
3   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
4   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

Если необходимо более сложное обновление, используйте слайсеры :

idx = pd.IndexSlice
df.loc[0, idx['foo', ['b','c']]] = 12.3
print (df)
   foo               po             di          
     a     b     c    a    b    c    a    b    c
0  NaN  12.3  12.3  NaN  NaN  NaN  NaN  NaN  NaN
1  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN
2  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN
3  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN
4  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN

df.loc[0, idx[:, ['b','c']]] = 12.3
print (df)
   foo               po               di            
     a     b     c    a     b     c    a     b     c
0  NaN  12.3  12.3  NaN  12.3  12.3  NaN  12.3  12.3
1  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN
2  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN
3  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN
4  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN

df.loc[:, idx[['po','di'], 'a']] = 12.3
print (df)
   foo              po              di          
     a    b    c     a    b    c     a    b    c
0  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
1  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
2  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
3  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
4  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
...