DataFrame多条件取值遇KeyError及首匹配行赋值方法问询
Pandas设置首个匹配行字段值的问题解决
我尝试编写条件映射
MARKET_STATES.OPENING_AUCTION,但运行下面代码时出现KeyError: (False, False, False):market_info_df.loc[market_info_df['issue_status' == '10', 'market_phase' == '0', 'trading_state' == ' '].iloc[0]] = MARKET_STATES.OPENING_AUCTION
问题1:这段代码实际执行的是什么操作?我的理解是通过iloc[0]找到三列符合指定值的首个实例,然后将其映射为MARKET_STATES.OPENING_AUCTION,是否正确?
你的理解完全错误,这段代码的逻辑从根上就错了:
- 首先,
'issue_status' == '10'是在比较两个字符串是否相等,结果是布尔值False(因为"issue_status"和"10"完全不是一回事),同理'market_phase' == '0'、'trading_state' == ' '也都是False。 - 这意味着你实际是在尝试取
market_info_df[(False, False, False)],这个索引根本不存在,直接触发KeyError。 - 退一步说,就算条件写法正确,你用
.iloc[0]拿到的是整行数据,再塞到loc[]里会被当成行标签去匹配,完全不是你想的“找符合条件的行并赋值”逻辑。
问题2:如何编写条件实现:当三列匹配指定值时,将首个匹配行的trade_type列设置为MARKET_STATES.OPENING_AUCTION?
核心思路是先筛选出符合三列条件的行,定位到第一个匹配行的索引,再给对应的trade_type字段赋值,下面给两种写法:
方法1:分步写法(可读性强)
# 生成筛选条件:三列同时满足指定值 mask = (market_info_df['issue_status'] == '10') & \ (market_info_df['market_phase'] == '0') & \ (market_info_df['trading_state'] == ' ') # 获取首个匹配行的索引 first_match_idx = market_info_df[mask].index[0] # 给对应行的trade_type列赋值 market_info_df.loc[first_match_idx, 'trade_type'] = MARKET_STATES.OPENING_AUCTION
方法2:一行写法(简洁高效)
market_info_df.loc[ (market_info_df['issue_status'] == '10') & (market_info_df['market_phase'] == '0') & (market_info_df['trading_state'] == ' '), 'trade_type' ].iloc[0] = MARKET_STATES.OPENING_AUCTION
防报错优化(无匹配行时不执行)
如果担心没有符合条件的行会触发索引错误,可以先判断筛选结果是否为空:
mask = (market_info_df['issue_status'] == '10') & \ (market_info_df['market_phase'] == '0') & \ (market_info_df['trading_state'] == ' ') if not market_info_df[mask].empty: first_match_idx = market_info_df[mask].index[0] market_info_df.loc[first_match_idx, 'trade_type'] = MARKET_STATES.OPENING_AUCTION
内容的提问来源于stack exchange,提问作者user19667022
相关产品推荐
相关产品推荐

