如何用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
相关产品推荐
相关产品推荐

