Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python .copy()不创建深度副本_Python_Pandas - Fatal编程技术网

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]