在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
相关产品推荐
相关产品推荐

