0

我有一个熊猫数据框:

df = pd.DataFrame({'AKey':[1, 9999, 1, 1, 9999, 2, 2, 2],\
    'AnotherKey':[1, 1, 1, 1, 2, 2, 2, 2]})

我想为特定列分配一个新值,并为该列中具有特定值的每个元素分配一个新值。

假设我想将新值分配给8888具有 value 的元素9999。我尝试了以下方法:

df[df["AKey"]==9999]["AKey"]=8888

但它返回以下错误:

A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead

所以我尝试使用loc

df.loc[df["AKey"]==9999]["AKey"]=8888

返回相同的错误。

我会很感激一些帮助和一些关于错误的解释,因为我真的无法理解它。

4

2 回答 2

1

您可以通过这种方式使用 loc:

df.loc[df["AKey"]==9999, "AKey"] = 8888

产生以下输出:

在此处输入图像描述

使用您的原始代码,您首先使用以下方法对数据框进行切片:

df.loc[df["AKey"]==9999]

然后为切片数据框的 AKey 列分配一个值。

["AKey"]=8888

换句话说,您正在更新切片,而不是数据框本身。

来自 Pandas文档

.loc[] 主要是基于标签的,但也可以与布尔数组一起使用。

分解代码:

df.loc[df["AKey"]==9999, "AKey"]

df["AKey"]==9999 将返回一个标识行的布尔数组,字符串“Akey”将立即标识将接收新值的列,无需切片。

于 2019-02-19T15:01:50.210 回答
1

好的,我找到了解决方案。如果我使用逻辑索引来识别列,它就可以工作。

df.loc[df["AKey"]==9999& df["AKey"]]=8888

但是,我仍然会感谢我收到的错误的帮助,因为我并不完全清楚为什么 Python 认为我在切片而不是索引

于 2019-02-19T15:02:03.483 回答