python-在多索引 pandas dataframe 中设置值的正确方法

我正在尝试在多索引 dataframe 中设置一个值.我正在使用.loc但仍在获取SettingsWithCopyWarning.我已经阅读了文档,但是不确定如何去做.我究竟做错了什么?

“ SettingWithCopyWarning:
试图在DataFrame的切片副本上设置一个值.
尝试改用.loc [row_indexer,col_indexer] = value

请参见文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj [item] = s“

arrays = [np.array(['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D']),
         np.array(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'])]

df = pd.DataFrame(np.random.randn(6, 8), columns=arrays)

mask = df.loc[:,('A','one')].ge(0)
df[mask].loc[:,('B')] = "A"

最佳答案

之所以会出现SettingWithCopyWarning,是因为您正在对DataFrame的子集执行.loc [].使用.loc []直接选择子集,不会出现此错误.

arrays = [np.array(['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D']),
         np.array(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight'])]

df = pd.DataFrame(np.random.randn(6, 8), columns=arrays)

mask = df.loc[:,('A','one')].ge(0)
df.loc[mask,('B')] = "A"

您也可以简化计算遮罩的那一行,因为您不需要.loc [].

mask = df[('A','one')].ge(0)      # or, df[('A','one')] >= 0