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

在Pandas中引用缺失索引时,如何避免值被覆盖为NA?

问题:合并两个DataFrame的Name列到新DataFrame且不覆盖非NA值

需要将stocks和major_indices两个DataFrame的'Name'列,匹配索引后填充到新DataFramemport中,要求仅填充匹配到的索引值,不覆盖已有的非NA值。

现有代码与问题现象

首先,目标索引列表:

>>> print(port_tickers_temp)
['ABBV', 'ABT', 'ACN', 'AXP', 'BA', 'BABA', 'BAC', 'BCS', 'BHP', 'BMY', 'BP', 'BRK-A', 'BRK-B', 'CAT', 'COP', 'CRM', 'CVX', 'DE', 'DHR', 'DJI']

初始实现代码:

mport = pd.DataFrame(index=port_tickers_temp)
mport['Name'] = stocks['Name']
mport['Name'] = major_indices['Name']

运行后发现,major_indices中不存在的索引对应的Name被全部覆盖为NaN:

>>> print(mport)
                               Name
ABBV                            NaN
ABT                             NaN
ACN                             NaN
AXP                             NaN
BA                              NaN
BABA                            NaN
BAC                             NaN
BCS                             NaN
BHP                             NaN
BMY                             NaN
BP                              NaN
BRK-A                           NaN
BRK-B                           NaN
CAT                             NaN
COP                             NaN
CRM                             NaN
CVX                             NaN
DE                              NaN
DHR                             NaN
DJI    Dow Jones Industrial Average

尝试过以下代码,结果完全一致:

mport['Name'] = stocks.loc[stocks.index.intersection(port_tickers_temp), 'Name']
mport['Name'] = major_indices.loc[major_indices.index.intersection(port_tickers_temp), 'Name']

解决方案

问题出在直接赋值会完全覆盖列的所有值,需要使用仅填充NaN的方法来保留已有非NA值:

方法1:使用fillna分步填充

先从stocks提取匹配索引的Name,再用major_indices的Name填充剩余的NaN:

mport = pd.DataFrame(index=port_tickers_temp)
# 第一步:填充stocks中匹配索引的Name
mport['Name'] = stocks['Name']
# 第二步:用major_indices的Name填充mport中未被填充的NaN
mport['Name'] = mport['Name'].fillna(major_indices['Name'])

方法2:使用combine_first合并Series

先分别提取两个数据源中匹配目标索引的Name系列,再合并(优先保留stocks的值):

# 提取stocks中属于目标索引的Name
stocks_names = stocks.loc[stocks.index.isin(port_tickers_temp), 'Name']
# 提取major_indices中属于目标索引的Name
indices_names = major_indices.loc[major_indices.index.isin(port_tickers_temp), 'Name']
# 合并两个Series,stocks的值优先,缺失部分用indices补充
combined_names = stocks_names.combine_first(indices_names)
# 生成最终的mport DataFrame
mport = pd.DataFrame(combined_names, index=port_tickers_temp)

两种方法都能实现:保留stocks中匹配到的Name,仅用major_indices的Name填充那些stocks中没有的索引值,不会覆盖已有非NA内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:56:27