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

遍历DataFrame列表时为何无法通过选列原地修改DataFrame?

问题原因及解决方法

现象原因

遍历列表时,df只是列表中DataFrame对象的临时引用。执行df = df[["A", "B"]]时,本质是创建了一个仅包含指定列的新DataFrame对象,并让df这个变量指向这个新对象——但列表dfl里存储的还是原来的DataFrame对象的引用,完全没被修改,所以打印出来的结果还是原数据。

解决方法

1. 原地修改原DataFrame对象(不创建新对象)

如果要严格在原DataFrame对象上修改内容,可以用loc[:]覆盖原对象的所有数据,这样列表里的引用指向的还是原来的对象,但内容已更新为指定列:

dfl = [pd.DataFrame(
     {
        "A": 1.0,
        "B": pd.Timestamp("20130102"),
         "C": pd.Series(1, index=list(range(4)), dtype="float32"),
         "D": "foo",
     }
)]
for df in dfl:
    df.loc[:] = df[["A", "B"]]  # 原地修改原对象内容
print(dfl)

输出会是仅包含"A"、"B"列的DataFrame列表。

2. 直接替换列表中的元素(更简洁)

如果不需要严格原地修改DataFrame对象,只是要列表最终存储的是目标列的DataFrame,可以遍历列表的索引,直接替换对应位置的元素:

dfl = [pd.DataFrame(
     {
        "A": 1.0,
        "B": pd.Timestamp("20130102"),
         "C": pd.Series(1, index=list(range(4)), dtype="float32"),
         "D": "foo",
     }
)]
for i in range(len(dfl)):
    dfl[i] = dfl[i][["A", "B"]]  # 替换列表中的元素
print(dfl)

这种方式更直观,结果也符合预期。

内容的提问来源于stack exchange,提问作者stanleyli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:47:07