如何基于迭代方法为pandas DataFrame的number列0值按顺序编号
错误原因分析
原有代码的问题出在循环体的赋值逻辑:每次循环都会匹配当前DataFrame内所有值为0的行统一赋值,第一次循环i=0时就把全部0都修改为1,后续循环已经没有可匹配的0值,自然无法按顺序生成编号。
迭代方案实现
单独维护一个计数器,仅在遍历到值为0的行时递增计数器并赋值即可:
import pandas as pd df = pd.DataFrame({ 'first_name': ['John', 'Jane', 'Marry', 'Victoria', 'Gabriel', 'Layla'], 'last_name': ['Smith', 'Doe', 'Jackson', 'Smith', 'Brown', 'Martinez'], 'number': [0, 29, 0, 52, 0, 0]}) # 计数器初始值为1,对应第一个0的替换值 zero_counter = 1 for idx, row in df.iterrows(): if row['number'] == 0: df.loc[idx, 'number'] = zero_counter zero_counter += 1
运行后输出结果:
first_name last_name number 0 John Smith 1 1 Jane Doe 29 2 Marry Jackson 2 3 Victoria Smith 52 4 Gabriel Brown 3 5 Layla Martinez 4
可选向量化方案(非迭代,更高性能)
如果不限制必须用迭代实现,pandas原生向量化操作效率更高:
df['number'] = df['number'].where(df['number'] != 0, (df['number'] == 0).cumsum())
内容的提问来源于stack exchange,提问作者rm1991
相关产品推荐
相关产品推荐

