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

如何用iloc为DataFrame条件匹配的首次/后续实例设置交易类型?

问题描述

现有如下DataFrame:

row  issue_status  market_phase       trade_type
 0        20           0                    
 1        10           0                    
 2        20           0                    
 3        10           0                    
 4        10           0                    
 5        10           0                 

需求:将满足issue_status == 10且market_phase == 0的首个实例映射为OPENING_AUCTION,后续符合该条件的实例映射为CONTINUOUS_TRADING,最终结果如下:

row  issue_status  market_phase                   trade_type
 0        20           0              ->        
 1        10           0              ->       OPENING_AUCTION
 2        20           0              ->       
 3        10           0              ->       CONTINUOUS_TRADING
 4        10           0              ->       CONTINUOUS_TRADING
 5        10           0              ->       CONTINUOUS_TRADING

尝试代码如下,运行时出现KeyError: (False, False, False)错误,要求必须使用iloc实现需求:

market_info_df.loc[market_info_df['issue_status' == '10', 'market_phase' == '0'].iloc[0]] = MARKET_STATES.OPENING_AUCTION

market_info_df.loc[market_info_df['issue_status' == '10', 'market_phase' == '0']].iloc[1:] = MARKET_STATES.INTRADAY_AUCTION
解决方法

你的代码错误在于布尔条件的写法,正确的思路是先筛选出符合条件的行位置,再用iloc定位赋值:

步骤1:生成匹配掩码并获取索引

先筛选出满足条件的行的掩码,再提取这些行在原DataFrame中的索引:

mask = (market_info_df['issue_status'] == 10) & (market_info_df['market_phase'] == 0)
matched_indices = market_info_df[mask].index

步骤2:对首个匹配项赋值

先获取trade_type列的位置索引,再用iloc定位到首个匹配行的对应列赋值:

if len(matched_indices) > 0:
    trade_type_col_idx = market_info_df.columns.get_loc('trade_type')
    market_info_df.iloc[matched_indices[0], trade_type_col_idx] = MARKET_STATES.OPENING_AUCTION

步骤3:对后续匹配项赋值

同样用iloc定位到剩余匹配行的对应列批量赋值:

if len(matched_indices) > 1:
    market_info_df.iloc[matched_indices[1:], trade_type_col_idx] = MARKET_STATES.CONTINUOUS_TRADING

完整代码示例

# 假设MARKET_STATES是预先定义的常量集合
MARKET_STATES = {
    'OPENING_AUCTION': 'OPENING_AUCTION',
    'CONTINUOUS_TRADING': 'CONTINUOUS_TRADING'
}

# 筛选符合条件的行索引
mask = (market_info_df['issue_status'] == 10) & (market_info_df['market_phase'] == 0)
matched_indices = market_info_df[mask].index

# 处理首个匹配行
if len(matched_indices) > 0:
    trade_type_col_idx = market_info_df.columns.get_loc('trade_type')
    market_info_df.iloc[matched_indices[0], trade_type_col_idx] = MARKET_STATES['OPENING_AUCTION']

# 处理后续匹配行
if len(matched_indices) > 1:
    market_info_df.iloc[matched_indices[1:], trade_type_col_idx] = MARKET_STATES['CONTINUOUS_TRADING']

关键说明

  • 原代码的布尔条件写法错误:market_info_df['issue_status' == '10', ...] 是语法错误,正确的条件判断应为(df['列名'] == 值),再用&连接多条件。
  • 使用columns.get_loc('trade_type')获取目标列的位置索引,配合iloc实现纯位置赋值,满足要求。
  • 增加长度判断,避免无匹配项时出现索引越界错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40