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

基于另一列更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:13:00