DataFrame新增列操作疑问:列表修改为何影响原列?
Pandas处理列表型列的常见问题解惑
问题1:apply+append生成的列全为None,原列还被修改
这是因为list.append()是原地修改列表的方法,它执行后不会返回新列表,而是返回None——所以用apply调用append,得到的TEST2列自然全是None。同时,因为append直接修改了原列表对象,原N列的内容也跟着变了。
解决办法换用不会原地修改的方式生成新列表:
- 用列表拼接符
+,它会返回全新列表,不改动原数据:df['TEST2'] = df['N'].apply(lambda x: x + ['新增元素']) - 或者先复制原列表再append,避免修改原数据:
df['TEST2'] = df['N'].apply(lambda x: x.copy().append('新增元素'))
问题2:直接赋值后修改新列,原列同步变化
这是Python可变对象的特性导致的——列表是可变类型,当你直接df['TEST4'] = df['N']时,并没有复制列表内容,只是让TEST4列和N列指向了同一个列表对象。所以不管改哪一列的元素,另一个都会同步变化。
而你之前处理数值型列没问题,是因为数值(比如int、float)是不可变类型,赋值时会直接复制值,新列和原列完全独立。
解决这个问题需要给列表做拷贝,让新列拥有独立的列表对象:
# 浅拷贝(适用于列表里都是不可变元素的情况) df['TEST4'] = df['N'].apply(lambda x: x.copy()) # 如果列表里还有嵌套的可变对象,要用深拷贝 import copy df['TEST4'] = df['N'].apply(lambda x: copy.deepcopy(x))
内容的提问来源于stack exchange,提问作者Lookasz_BL
相关产品推荐
相关产品推荐

