如何更新DataFrame添加值且不覆盖同列已有数据?
问题:Pandas中如何仅更新指定映射并保留DataFrame原有值
原始DataFrame
reason market_state 0 NaN UNSCHEDULED_AUCTION 1 NaN None 2 NaN CLOSED 3 NaN CONTINUOUS_TRADING 4 NaN None 5 NaN UNSCHEDULED_AUCTION 6 NaN UNSCHEDULED_AUCTION 7 F None 8 NaN CONTINUOUS_TRADING 9 SL None 10 NaN HALTED 11 NaN None 12 NaN None 13 L None
错误尝试及问题
尝试用三次独立的map赋值更新market_state:
market_info_df['market_state'] = market_info_df['reason'].map({'F': OPENING_AUCTION}) market_info_df['market_state'] = market_info_df['reason'].map({'SL': CLOSING_AUCTION}) market_info_df['market_state'] = market_info_df['reason'].map({'L': CLOSED})
但每次赋值都会覆盖整个market_state列,导致未匹配的行全部变为NaN,仅保留最后一次映射的结果。
解决方案
方法1:合并映射字典 + fillna保留原值
将所有映射规则合并为一个字典,用map生成新值后,通过fillna填充回原有列的非匹配值:
# 定义完整映射字典 reason_map = { 'F': OPENING_AUCTION, 'SL': CLOSING_AUCTION, 'L': CLOSED } # 仅更新匹配行,其余保留原值 market_info_df['market_state'] = market_info_df['reason'].map(reason_map).fillna(market_info_df['market_state'])
方法2:用loc按条件逐个更新
通过loc精准定位符合条件的行,单独更新对应值,不会影响其他行:
market_info_df.loc[market_info_df['reason'] == 'F', 'market_state'] = OPENING_AUCTION market_info_df.loc[market_info_df['reason'] == 'SL', 'market_state'] = CLOSING_AUCTION market_info_df.loc[market_info_df['reason'] == 'L', 'market_state'] = CLOSED
目标结果
两种方法均可得到如下DataFrame:
reason market_state 0 NaN UNSCHEDULED_AUCTION 1 NaN None 2 NaN CLOSED 3 NaN CONTINUOUS_TRADING 4 NaN None 5 NaN UNSCHEDULED_AUCTION 6 NaN UNSCHEDULED_AUCTION 7 F OPENING_AUCTION 8 NaN CONTINUOUS_TRADING 9 SL CLOSING_AUCTION 10 NaN HALTED 11 NaN None 12 NaN None 13 L CLOSED
内容的提问来源于stack exchange,提问作者user19667022
相关产品推荐
相关产品推荐

