在多索引 Pandas Dataframe 中设置值的正确方法

Jel*_*erd 4 python multi-index pandas

我正在尝试在多索引数据框中设置一个值。我正在使用 .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"
Run Code Online (Sandbox Code Playgroud)

Cra*_*aig 5

SettingWithCopyWarning 发生是因为您正在.loc[]对 DataFrame 的一个子集进行操作。用于.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"
Run Code Online (Sandbox Code Playgroud)

您还可以简化计算掩码的行,因为您不需要这样做.loc[]

mask = df[('A','one')].ge(0)      # or, df[('A','one')] >= 0
Run Code Online (Sandbox Code Playgroud)