在多索引 Pandas Dataframe 中设置值的正确方法
Correct way to set value in multi-index Pandas 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[项目] = 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[]
到 select 子集,你不会得到这个错误。
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
我正在尝试在多索引数据框中设置一个值。我正在使用 .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[项目] = 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[]
到 select 子集,你不会得到这个错误。
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