You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免修改Pandas DataFrame子集的列表时改动原DataFrame

如何避免修改Pandas DataFrame子集的列表时改动原DataFrame

这问题我之前也碰到过!核心原因其实是Python里列表的特性——它是可变对象,你从DataFrame里取出来的col_2_list根本不是新列表,只是原DataFrame里列表的一个“引用”,相当于你和原df共用同一个列表,改了自然两边都变。

要解决这个问题,关键就是拿到列表的副本而非引用,下面给你两种实用的方法:

方法一:循环时复制列表(直观易懂)

在取出col_2的列表时,直接复制一份新的列表,这样后续的修改就只作用在新列表上,完全不影响原DataFrame。复制列表可以用两种方式:

  • 用list()构造函数
  • 用切片语法[:]

修改后的完整代码如下:

import pandas as pd

dict_for_df = {
    "col_1": ["A", "B", "C"],
    "col_2": [["D", "E"], ["F", "H"], ["I", "J"]],
}
df = pd.DataFrame(dict_for_df)

# 用来保存处理后的列表,方便后续使用
processed_lists = []
for i in range(df.shape[0]):
    col_1_value = df["col_1"][i]
    # 复制列表,生成独立的新列表
    col_2_list = list(df["col_2"][i])  # 也可以写成 df["col_2"][i][:]
    col_2_list.insert(0, col_1_value)
    processed_lists.append(col_2_list)

# 原DataFrame完全没被改动
print("原DataFrame:")
print(df)
# 处理后的列表可以单独使用
print("\n处理后的列表:")
print(processed_lists)

方法二:用Pandas矢量化操作(高效优雅)

如果你的数据量较大,循环效率会比较低,推荐用apply函数来批量处理,全程不修改原DataFrame,直接生成新的结果列表:

import pandas as pd

dict_for_df = {
    "col_1": ["A", "B", "C"],
    "col_2": [["D", "E"], ["F", "H"], ["I", "J"]],
}
df = pd.DataFrame(dict_for_df)

# 用apply生成处理后的列表,原df不受影响
processed_lists = df.apply(lambda row: [row['col_1']] + row['col_2'], axis=1).tolist()

# 查看原df,还是初始状态
print(df)
# 查看处理后的列表
print(processed_lists)

这样不管用哪种方法,你都能保留原DataFrame的完整性,同时拿到可以后续使用的处理后列表啦~

备注:内容来源于stack exchange,提问作者Artem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:59:50