将新值分配给重复(或多个)objective 个元素到 pandas 数据框

assign new value to repeated (or multiple) objective element(s) to a pandas dataframe

我有一个 pandas 数据框:

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

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

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

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

但是returns出现以下错误:

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

返回相同的错误。

我将不胜感激对错误的一些帮助和解释,因为我真的无法理解它。

你可以这样使用loc:

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

生成以下输出:

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

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

然后为切片数据帧的 AKey 列赋值。

["AKey"]=8888

换句话说,您更新的是切片,而不是数据帧本身。

来自 Pandas documentatiom:

.loc[] is primarily label based, but may also be used with a boolean array.

分解代码:

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

df["AKey"]==9999 将 return 一个标识行的布尔数组,字符串 "Akey" 将立即标识将接收新值的列没有切片。

好的,我找到了解决办法。如果我还使用逻辑索引来标识列,它会起作用。

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

不过,对于我收到的错误,我仍然希望得到帮助,因为我不完全清楚为什么 Python 认为我是在切片而不是索引