如何为pandas DataFrame新增元素均为[0]单元素列表的列
问题原因
你之前执行df = df.assign(c=[0])无法得到预期结果的核心原因是:传入的c参数值是长度为1的列表,和目标DataFrame的3行长度不匹配,pandas会直接抛出值长度与索引长度不匹配的异常,无法完成列赋值。
另外pandas在给列赋值传入可迭代对象时,会默认按行拆分可迭代对象的元素填充到每一行,直接传入单个[0]既满足不了长度匹配要求,也无法实现每行存一个独立列表[0]的需求。
正确实现方式
推荐使用列表推导式生成和DataFrame行数等长、每个元素为独立[0]的序列传入,避免可变对象引用的坑,两种常用写法如下:
- 写法1:沿用
assign方法实现
import pandas as pd df = pd.DataFrame({'a':[[1,2],[3,2],[5,2]],'b':[[1],[9],[9,9]]}) df = df.assign(c=[[0] for _ in range(len(df))])
- 写法2:直接列赋值,写法更简洁
df['c'] = [[0] for _ in range(len(df))]
注意避坑
禁止使用[[0]] * len(df)的方式生成赋值序列:这种写法生成的序列中,所有位置的元素都指向内存中同一个[0]列表对象,后续你修改任意一行c列的列表内容时,所有行的c列都会同步被修改,会引发难以排查的逻辑bug。
执行上述正确代码后,得到的DataFrame结构和预期完全一致:
a b c 0 [1, 2] [1] [0] 1 [3, 2] [9] [0] 2 [5, 2] [9, 9] [0]
内容的提问来源于stack exchange,提问作者User1917931829
相关产品推荐
相关产品推荐

