/ / Pandas оновлення значень в багатовимірному індексі frame of data - python, pandas, dataframe, multi-index

Pandas оновлюють значення в багатовимірному індексі даних frame - python, pandas, dataframe, multi-index

Як я можу редагувати значення декількох індексних кадрів даних? Якщо це був нераспространений індексний файл, я знаю, що зможу це зробити: 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
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

Відповіді:

4 для відповіді № 1

Використовуйте tuples для вибраного 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