5

How can I edit a values of a multi-index dataframe? If it was a non-multi-index dataframe, I know I could do this: df.at[0,'foo'] = 12.3. Also, this does not work: df.loc[0]['foo']['a'] = 12.3.

Consider a multi-index column dataframe.

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

1 Answer 1

17

Use tuples for select MultiIndex in columns:

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

If need more complicated updating use slicers:

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.