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

Python循环处理DataFrame空值替换报TypeError的解决方法(2000万行)

解决Pandas生成real_lastName列的TypeError及大数据量优化方案

错误原因分析

你遇到的TypeError: string indices must be integers是因为直接遍历df时,遍历的是DataFrame的列名(比如'FirstName'、'Middle'这类字符串),而不是每一行数据。这时候row是字符串类型,你尝试用row['LastName']这种字典式索引自然会报错——字符串的索引只能是整数位置,不能是字符串键。

而且更关键的是:即使你改成遍历行的方式,对于2000万行的数据来说,循环遍历每一行的效率极低,完全不适合大数据量场景。

正确解决方案(矢量化操作,高效处理大数据)

Pandas的核心优势就是矢量化操作,底层用C实现,处理千万级数据速度极快。推荐以下几种方法:

方法1:使用fillna(最简洁)

直接用Middle列的值填充LastName的空值,生成新列:

df['real_lastName'] = df['LastName'].fillna(df['Middle'])

方法2:使用numpy.where(逻辑更直观)

可以清晰指定条件:当LastName为空时取Middle,否则取LastName:

import numpy as np
df['real_lastName'] = np.where(df['LastName'].isnull(), df['Middle'], df['LastName'])

方法3:使用Pandas的where方法

和numpy.where逻辑类似,是Pandas原生的方法:

df['real_lastName'] = df['LastName'].where(df['LastName'].notnull(), df['Middle'])

为什么不推荐循环?

如果你尝试用df.iterrows()遍历行(比如下面的代码),虽然能解决错误,但对于2000万行的数据来说,会花费极长的时间(可能是几分钟甚至更久),因为每一次循环都是Python层面的逐行操作,远不如矢量化操作高效:

# 强烈不推荐!仅作错误修正演示,大数据量禁用
import pandas as pd
df['real_lastName'] = pd.Series(dtype=str)
for idx, row in df.iterrows():
    if pd.isnull(row['LastName']):
        df.loc[idx, 'real_lastName'] = row['Middle']
    else:
        df.loc[idx, 'real_lastName'] = row['LastName']

验证结果

用你给出的示例数据测试,最终生成的DataFrame如下:

FirstNameMiddleLastNamereal_lastName
TomJuNaNJu
KityNaNRobRob

完全符合你的需求。

内容的提问来源于stack exchange,提问作者Learn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:24