pandas遍历DataFrame无限循环修复及同Customer_ID字段填充实现
问题原因
你写的代码出现无限循环,核心是两个错误:
- 内层嵌套了
while i <=4循环,但循环体内没有任何修改i值的逻辑,外层for循环拿到的i是固定值,只要进入while循环就会永远满足判断条件,无法退出 - 存在两个隐藏bug:
iterrows()返回的row是行数据的快照副本,你修改DataFrame后row里存的还是初始值,会导致字段判断逻辑失效- 当
i取到最后一行索引4时,访问i+1=5会触发索引越界报错
修复方法
最小修改版(保留你原本的逐行对比逻辑)
删掉无意义的while循环,直接遍历到倒数第二行即可,判断字段值时直接从DataFrame实时取值,不要用缓存的row副本:
import pandas as pd data = { 'Customer_ID':['CUS_0xd40','CUS_0xd40','CUS_0xd40', 'CUS_0x21b1', 'CUS_0x2dbc'], 'SNN': ['821-00-0265','#F%$D@*&8','004-07-5839','133-16-7738', '031-35-0942'], 'Occupation':['Scientist', '_______' ,'Scientist', 'Engineer' ,'Entrepreneur'], 'Credit_Mix':['_', 'Good', 'Standard','Bad', 'Standard'] } df=pd.DataFrame(data) # 仅遍历到倒数第二行,避免i+1越界 for i in range(len(df)-1): if df.loc[i, "Customer_ID"] == df.loc[i+1, "Customer_ID"]: # 实时取df中的值判断,不用缓存的row if df.loc[i, "Credit_Mix"] == '_': df.loc[i, "Credit_Mix"] = df.loc[i+1, "Credit_Mix"] if df.loc[i, "Occupation"] == '_______': df.loc[i, "Occupation"] = df.loc[i+1, "Occupation"]
运行后处理结果符合预期:
- 第0行Credit_Mix的占位符
_被替换为下一行的Good - 第1行Occupation的占位符
_______被替换为下一行的Scientist - 其余行无符合替换条件的值,保持原有内容。
高性能版本(推荐,适配大数据量场景)
逐行遍历性能差,数据量大时运行速度很慢,推荐用pandas原生的分组填充逻辑,一次性处理所有同客户的缺失值:
import numpy as np # 先把自定义占位符替换为pandas可识别的空值 df = df.replace({ 'Credit_Mix': {'_': np.nan}, 'Occupation': {'_______': np.nan} }) # 按客户ID分组,用后一行的有效值向前填充空值 df[['Credit_Mix', 'Occupation']] = df.groupby('Customer_ID')[['Credit_Mix', 'Occupation']].bfill()
这个写法不仅能处理相邻两行的补全,就算同一个客户连续多行有占位符,也能一次性补全,鲁棒性更强。
内容的提问来源于stack exchange,提问作者user3598524
相关产品推荐
相关产品推荐

