我有一个名为df
的数据框。
该数据框由名为Summary
和KeyWords_in_Array
的2列组成。
df["KeyWords_in_Array"]
列中的每一行都由一个数组组成。
我想创建一个名为KeyWords_in_Array_wo_insurance
的新列,该列等于df["KeyWords_in_Array"]
,但是如果数组中存在元素“ INSURANCE”,则将其删除。
我的代码如下:
df["KeyWords_in_Array_wo_insurance"] = df["KeyWords_in_Array"].copy(deep=True)
df["KeyWords_in_Array_wo_insurance"] = df["KeyWords_in_Array"].apply(lambda k: k.remove("INSURANCE"))
如何
新列df["KeyWords_in_Array_wo_insurance"]
用None
填充,而旧列df["KeyWords_in_Array"]
在数组中不再包含元素“ INSURANCE”。
由于我做了df["KeyWords_in_Array"]
的深层副本,所以我不明白自己在做什么错,因此新列应该完全不连接。
答案 0 :(得分:3)
您创建了.copy
的{{1}},并将其存储为df["KeyWords_in_Array"]
,但是在df["KeyWords_in_Array_wo_insurance"]
上调用了.apply
,因此实际上第二行代码应该是
df["KeyWords_in_Array"]
另一个问题是df["KeyWords_in_Array_wo_insurance"] = df["KeyWords_in_Array_wo_insurance"].apply(lambda k: k.remove("INSURANCE"))
就位并返回list.remove
,因此您不能像以前那样使用None
。
但是,这仍然无效。
.apply
为什么?
df = pd.DataFrame({'KeyWords_in_Array': [['a', 'b', 'c', 'INSURANCE']]})
df["KeyWords_in_Array_wo_insurance"] = df["KeyWords_in_Array"].copy(deep=True)
def remove_insurance(k):
k.remove('INSURANCE')
return k
df["KeyWords_in_Array_wo_insurance"] = df["KeyWords_in_Array_wo_insurance"].apply(remove_insurance)
print(df)
# KeyWords_in_Array KeyWords_in_Array_wo_insurance
# 0 [a, b, c] [a, b, c]
的文档字符串有一些见解:
注意 ----- 当
Series.copy
时,数据被复制但实际的Python对象 不会递归地复制,仅复制对对象的引用。 这与标准库中的deep=True
相反, 递归地复制对象数据(请参见下面的示例)。在
copy.deepcopy
(基础对象)被复制时Index
对象被复制 由于性能原因,不复制numpy数组。由于deep=True
是 不可变,可以安全地共享基础数据并复制 不需要。
解决方案
将Index
手动复制到df["KeyWords_in_Array"]
,并且对df["KeyWords_in_Array_wo_insurance"]
使用更好的功能:
.apply