基于另一列更新pandas DataFrame列时遇TypeError问题求助
解决你的Pandas DataFrame替换问题及错误分析
首先,咱们先拆解你遇到的两个核心问题:
1. 为什么会报TypeError: string indices must be integers?
你当前用的是dft['rbc_security_type1'].apply(...)——这是对单个Series(也就是rbc_security_type1列)的每个单元格值单独执行lambda函数。此时lambda的参数col_value是单个的单元格内容(比如第一个是字符串'0',第二个是'CORP'),而不是整行数据。你试图用col_value['rbc_security_type1']去索引一个字符串/单个值,这显然不符合语法,所以会抛出这个错误。
另外你提到的类型问题确实存在:你构造DataFrame时用了np.array混合字符串和整数0,numpy会自动将整个数组转为字符串类型,所以你的rbc_security_type1列里的0其实是字符串'0',不是整数0——这也是你原代码里条件判断逻辑不生效的隐藏原因。
2. 正确的实现方式
下面给你几种高效的解决方案,优先推荐不用apply的方法(因为apply在大数据量下效率较低):
方法一:用布尔索引(最直观高效)
直接定位到rbc_security_type1等于'0'的行,将这些行的该列值替换为对应行的market值:
# 先创建布尔掩码,筛选出需要替换的行 mask = dft['rbc_security_type1'] == '0' # 替换对应位置的值 dft.loc[mask, 'rbc_security_type1'] = dft.loc[mask, 'market']
方法二:用np.where(简洁的向量化操作)
利用numpy的向量化判断,一行代码完成替换:
import numpy as np dft['rbc_security_type1'] = np.where( dft['rbc_security_type1'] == '0', # 判断条件 dft['market'], # 条件为True时的值 dft['rbc_security_type1'] # 条件为False时的值 )
方法三:如果一定要用apply(按行处理)
如果你坚持用apply,需要对整个DataFrame调用apply,并指定axis=1表示按行处理(此时lambda的参数是整行对象):
dft['rbc_security_type1'] = dft.apply( lambda row: row['market'] if row['rbc_security_type1'] == '0' else row['rbc_security_type1'], axis=1 )
额外处理:类型统一优化
如果你想先统一列的类型,避免字符串和整数混合的问题,可以先把'0'转为NaN,再用fillna替换:
# 将'0'替换为NaN dft['rbc_security_type1'] = dft['rbc_security_type1'].replace('0', np.nan) # 用market列的值填充NaN dft['rbc_security_type1'] = dft['rbc_security_type1'].fillna(dft['market'])
验证结果
执行上述任意一种方法后,你都会得到期望的输出:
market rbc_security_type1 0 MAXESSUS MAXESSUS 1 BLOOMBERG CORP 2 BROKER_TEC GOVT 3 MAXESSUS MAXESSUS
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

