解决pandas中基于两列组合与字典映射生成新列的哈希错误
修复Pandas字典映射生成新列的TypeError问题
错误原因
- 条件判断错误:直接用
market_info_df['is_and_mp'] in no_collision_issue_status无法对Series做批量判断,Pandas中需用isin()方法实现序列元素的批量匹配。 - 字典键类型错误:
(market_info_df['issue_status'], market_info_df['trading_state'])是两个Series对象,属于不可哈希类型,不能作为字典的键来取值。
修复方案
步骤1:构建正确的过滤掩码
先生成符合条件的布尔掩码,筛选需要处理的行:
mask = market_info_df['is_and_mp'].isin(no_collision_issue_status) | (market_info_df['trading_state'] != ' ')
步骤2:生成可哈希元组并映射字典
将符合条件行的issue_status和trading_state组合成元组(可哈希类型),再通过map方法匹配字典值:
# 把指定列组合成元组序列 state_tuples = market_info_df.loc[mask, ['issue_status', 'trading_state']].apply(tuple, axis=1) # 映射字典值到新列 market_info_df.loc[mask, 'market_state'] = state_tuples.map(MARKET_STATES_DICT)
补充说明
如果MARKET_STATES_DICT中存在三元组键(如('100', ' ', 'F')),需要将对应的第三个字段(比如market_phase)也加入元组生成:
state_tuples = market_info_df.loc[mask, ['issue_status', 'trading_state', 'market_phase']].apply(tuple, axis=1) market_info_df.loc[mask, 'market_state'] = state_tuples.map(MARKET_STATES_DICT)
完整代码示例
# 构建过滤掩码 mask = market_info_df['is_and_mp'].isin(no_collision_issue_status) | (market_info_df['trading_state'] != ' ') # 生成元组序列并映射字典值 state_tuples = market_info_df.loc[mask, ['issue_status', 'trading_state']].apply(tuple, axis=1) market_info_df.loc[mask, 'market_state'] = state_tuples.map(MARKET_STATES_DICT)
内容的提问来源于stack exchange,提问作者user19667022
相关产品推荐
相关产品推荐

