为何修改Pandas DataFrame行数据无法同步更新原DataFrame?
Pandas iterrows() 修改行后原DataFrame不更新的原因
这是预期行为吗?
是的,这完全是Pandas的预期行为。你通过iterrows()拿到的row是原DataFrame行数据的副本,不是对原数据的引用,所以修改这个row只会改变副本的值,不会同步到原DataFrame中。
为什么iterrows()返回的是副本而非引用?
核心原因是Pandas的底层存储设计:DataFrame是按列存储的,每一列对应一块连续的内存(基于NumPy数组)。而一行数据是跨多个列的,分散在不同的内存块里。如果要返回行的引用,意味着每次修改行元素都要操作多个独立的内存块,这会极大降低性能,违背了Pandas为列级批量操作优化的设计目标。
所以iterrows()会返回一个包含行索引和行数据副本(Series对象)的元组,你对这个Series的修改不会影响原DataFrame的底层数据。
如何让行修改同步到原DataFrame?
如果你确实需要行级循环修改(注意:Pandas不推荐行级循环,列级向量操作效率远更高),可以通过索引直接修改原DataFrame:
import pandas as pd fruit = {"Fruit": ['Apple','Avacado','Banana','Strawberry','Grape'], "Color": ['Red','Green','Yellow','Pink','Green'], "Price": [45, 90, 60, 37, 49]} df = pd.DataFrame(fruit) for index, row in df.iterrows(): # 直接通过loc修改原DataFrame的对应位置 df.loc[index, 'Price'] = row['Price'] * 2 print(df.loc[index, 'Price']) print(df['Price']) # 现在原DataFrame的Price列已经被更新
当然,对于这种简单的数值翻倍操作,最推荐的还是Pandas的列级向量操作,代码更简洁且效率极高:
df['Price'] = df['Price'] * 2
内容的提问来源于stack exchange,提问作者Ian Engelbrecht
相关产品推荐
相关产品推荐

