.copy()不会创建深层副本

时间:2019-05-14 14:57:17

标签: python pandas

我有一个名为df的数据框。 该数据框由名为SummaryKeyWords_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"]的深层副本,所以我不明白自己在做什么错,因此新列应该完全不连接。

1 个答案:

答案 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