You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:51:21