如何在Pandas中按条件向嵌套列表列追加元素?
Pandas按条件修改嵌套列表列的正确方法
问题原因分析
- 所有行列表同步修改:用
[[[1],[1],[1]]] * df.shape[0]生成B列时,Python会将同一个嵌套列表对象重复引用到每一行。由于列表是可变类型,修改任意一行的列表会导致所有行的列表同步变化——它们本质上指向同一个内存地址。 - 目标行变为None:
list.append()是原地修改列表的方法,它的返回值是None。你用apply(lambda x: x[0].append(2))时,返回的就是None,因此mask替换后符合条件的行值变成了None。
解决方案
第一步:正确初始化独立的嵌套列表列
避免用乘法生成列表,改用列表推导式创建每行独立的嵌套列表:
import pandas as pd df = pd.DataFrame(data={'A': [1, 2, 3]}) # 列表推导式生成每行独立的嵌套列表 df['B'] = [[[1], [1], [1]] for _ in range(df.shape[0])]
第二步:按条件修改目标行
方法一:用loc定位修改
# 定位A=2的行,生成新的嵌套列表替换原列表 mask = df['A'] == 2 df.loc[mask, 'B'] = df.loc[mask, 'B'].apply(lambda x: [x[0] + [2], x[1], x[2]])
方法二:用apply遍历处理每行
df['B'] = df.apply( lambda row: [row['B'][0] + [2], row['B'][1], row['B'][2]] if row['A'] == 2 else row['B'], axis=1 )
最终结果
执行上述代码后,输出符合预期:
print(df) # A B # 0 1 [[1], [1], [1]] # 1 2 [[1, 2], [1], [1]] # 2 3 [[1], [1], [1]]
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

