【问题标题】:Correct way to set value in multi-index Pandas Dataframe在多索引 Pandas Dataframe 中设置值的正确方法
【发布时间】:2018-06-05 07:57:18
【问题描述】:

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

【问题讨论】:

  • .loc 中应用掩码。如df.loc[mask,('B')] = "A"

标签: python pandas multi-index


【解决方案1】:

发生 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

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 2016-02-19
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2016-10-24
    • 2016-11-30
    • 2017-12-20
    相关资源
    最近更新 更多