遍历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
相关产品推荐
相关产品推荐

