Python .copy()不创建深度副本
我有一个名为Python .copy()不创建深度副本,python,pandas,Python,Pandas,我有一个名为df的数据帧。 此数据框由两列组成,分别名为“摘要”和“关键字”\u(在\u数组中) df[“关键字在数组中”]列中的每一行都由一个数组组成 我想创建一个名为KeyWords\u in_Array\u wo\u insurance的新列,该列等于df[“KeyWords\u in_Array”],但删除数组中存在的元素“insurance” 我的代码如下: df["KeyWords_in_Array_wo_insurance"] = df["KeyWords_in_Array"].c
df
的数据帧。
此数据框由两列组成,分别名为“摘要”
和“关键字”\u(在\u数组中)
df[“关键字在数组中”]
列中的每一行都由一个数组组成
我想创建一个名为KeyWords\u in_Array\u wo\u insurance
的新列,该列等于df[“KeyWords\u 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\u wo_insurance”]
填充为None
,旧列df[“KeyWords_in_Array”]
不再包含数组中的元素“insurance”
我不明白我做错了什么,因为我做了一个深度复制的
df[“KeyWords\u in_Array”]
,因此新列应该完全没有连接。您创建了.copy
的df[“KeyWords\u in_Array”]
并将其存储为df[“KeyWords\u in_in_Array\u\u保险”]
但被称为。在df[“KeyWords\u in_Array”]
上应用,因此实际上第二行代码应该是
df["KeyWords_in_Array_wo_insurance"] = df["KeyWords_in_Array_wo_insurance"].apply(lambda k: k.remove("INSURANCE"))
另一个问题是list.remove
已就位并返回None
,因此您无法使用。请按您的方式应用
然而,这仍然不起作用
为什么?
Series.copy
的docstring有一些见解:
注释
-----
当deep=True
时,会复制数据,但不会复制实际的Python对象
不会递归复制,只复制对对象的引用。
这与标准库中的copy.deepcopy
相反,
它递归地复制对象数据(参见下面的示例)
当deep=True
复制Index
对象时,底层
由于性能原因,未复制numpy阵列。因为索引
是
不可变,基础数据可以安全地共享和复制
这是不需要的
解决方案
手动将df[“关键字数组中的关键字”]
复制到df[“关键字数组中的关键字数组中的关键字保险”]
并使用的更好功能。应用:
df = pd.DataFrame({'KeyWords_in_Array': [['a', 'b', 'c', 'INSURANCE']]})
df["KeyWords_in_Array_wo_insurance"] = [list(data) for data in df["KeyWords_in_Array"]]
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, INSURANCE] [a, b, c]
如果可以提供样本数据,这将有助于洛蒂补充更多信息,希望它能帮助你。人们会感到困惑,因为您没有指定您的数据是一个列表列表,因此结果是“无”。另外,不要将样本数据作为图片发布,人们不能使用它。非常感谢。我不知道你为什么说这是一个列表?列表由单个元素(字符串)组成。除非你将字符串作为一种特定类型的列表引用。你是对的,是一系列列表,应该更精确。数组中的列关键字是一系列列表,请查看由DeepSpace提供的解决方案
df = pd.DataFrame({'KeyWords_in_Array': [['a', 'b', 'c', 'INSURANCE']]})
df["KeyWords_in_Array_wo_insurance"] = [list(data) for data in df["KeyWords_in_Array"]]
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, INSURANCE] [a, b, c]