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如下:
| FirstName | Middle | LastName | real_lastName |
|---|---|---|---|
| Tom | Ju | NaN | Ju |
| Kity | NaN | Rob | Rob |
完全符合你的需求。
内容的提问来源于stack exchange,提问作者Learn
相关产品推荐
相关产品推荐

