将新值分配给重复(或多个)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 认为我是在切片而不是索引
我有一个 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 认为我是在切片而不是索引