Search code examples
pythonpandasnumpymulti-index

Changing the Values of a Multi-Index Dataframe


I have a multi-index dataframe that is set up as follows:

index = pd.MultiIndex.from_product([['A','B','C'], ['x','y', 'z']])
multi_index = pd.DataFrame(np.nan, index=np.arange(10), columns=index)

Which produces the following output:

A           B           C        
    x   y   z   x   y   z   x   y   z
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
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN NaN NaN NaN

I am trying to fill the values of the multi-index data frame with values. As a toy example, what I've tried to do is change the value of ['A','x',0] as follows:

multi_index['A']['x'].loc[0] = 65.2

However, I receive a 'SettingWithCopyWarning', which makes sense to me. I've also tried

multi_index['A'].iloc[[1],0] = 65.2

and received the same warning.

Is there a way one can change the values of a multi-index dataframe on a entry-by-entry basis? I.E changing the 0th index of ['A','x']?


Solution

  • Try:

    multi_index.loc[0, ('A', 'x')] = 65.2
    

    You can use tuples with loc for index labelling to access your multiindex columns or rows.

    Or you can use iloc like this using integer index position selection, for example 2 here is the third column:

    multi_index.iloc[0, 2] = 70.3
    

    Output:

          A             B           C        
          x   y     z   x   y   z   x   y   z
    0  65.2 NaN  70.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
    5   NaN NaN   NaN NaN NaN NaN NaN NaN NaN
    6   NaN NaN   NaN NaN NaN NaN NaN NaN NaN
    7   NaN NaN   NaN NaN NaN NaN NaN NaN NaN
    8   NaN NaN   NaN NaN NaN NaN NaN NaN NaN
    9   NaN NaN   NaN NaN NaN NaN NaN NaN NaN