使用Pandas itertuples依据前一行值更新列报错,求解决方案
问题分析与解决方案
错误原因
你的代码存在两个关键问题:
- 语法错误:
setattr(row, 'col3') = getattr(prev,'col1')完全不符合setattr的调用规范,正确写法是setattr(对象, 属性名, 目标值)。 - 核心限制:
itertuples()返回的是不可变的namedtuple,即便修正语法,也没法修改它的属性——namedtuple的字段是只读的,不支持赋值操作。
解决方案:不一定非要用iloc/loc,优先用矢量化操作
Pandas的设计初衷就是用矢量化操作替代逐行循环,效率高得多。要实现“用前一行col1的值更新当前行col3”,直接用shift()函数就能搞定:
import pandas as pd d = {'col1': ['A', 'B', 'C', 'D'], 'col2': [1, 2, 3, 4], 'col3': ['E', 'F', 'G', 'H']} df = pd.DataFrame(data=d) # 把col1上移一行(即前一行的值),赋值给col3的第2行及以后 df.loc[1:, 'col3'] = df['col1'].shift(1)[1:] # 如果想保留第一行的col3原值,更简洁的写法: # df['col3'] = df['col1'].shift(1).fillna(df['col3'])
非要用循环的话(不推荐大数据量)
如果坚持要逐行处理,别用itertuples(),可以用iterrows(),但必须通过df.loc/df.iloc直接修改原DataFrame——因为iterrows()返回的是行的副本:
prev_col1 = df.iloc[0]['col1'] for idx in range(1, len(df)): df.loc[idx, 'col3'] = prev_col1 prev_col1 = df.loc[idx, 'col1']
内容的提问来源于stack exchange,提问作者newoptionz
相关产品推荐
相关产品推荐

