多级索引DataFrame的列值未正确更新

时间:2017-06-30 07:19:29

标签: pandas dataframe

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(30).reshape(6,5), index=[list('aaabbb'), list('XYZXYZ')])

print(df)

df.loc[pd.IndexSlice['a'], 3] /= 10

print(df)

从上面的代码我预期在下表:

      0   1   2   3   4
a X   0   1   2   0.3   4
  Y   5   6   7   0.8   9
  Z  10  11  12  0.13  14
b X  15  16  17  18  19
  Y  20  21  22  23  24
  Z  25  26  27  28  29

但实际结果如下表所示:

      0   1   2     3   4
a X   0   1   2   NaN   4
  Y   5   6   7   NaN   9
  Z  10  11  12   NaN  14
b X  15  16  17  18.0  19
  Y  20  21  22  23.0  24
  Z  25  26  27  28.0  29

代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

需要按:指定第二级才能选择所有值:

df.loc[pd.IndexSlice['a', :], 3] /= 10
print(df)
      0   1   2     3   4
a X   0   1   2   0.3   4
  Y   5   6   7   0.8   9
  Z  10  11  12   1.3  14
b X  15  16  17  18.0  19
  Y  20  21  22  23.0  24
  Z  25  26  27  28.0  29

切片解决方案:

df.loc[(slice('a'), slice(None)), 3] /= 10
print(df)
      0   1   2     3   4
a X   0   1   2   0.3   4
  Y   5   6   7   0.8   9
  Z  10  11  12   1.3  14
b X  15  16  17  18.0  19
  Y  20  21  22  23.0  24
  Z  25  26  27  28.0  29