如何为缺失同名行的DataFrame补0合并,保留必要重复行?
解决DataFrame合并时数据偏移且保留重复行的方案
核心思路是给每个重复的itemDescEng行添加唯一标识,通过复合索引实现精准对齐,缺失行自动补0,同时保留所有必要的重复行。
修改后的代码
import pandas as pd import requests stockData = [] for a, b, c, d in list_of_Dates: parameters = ( ("companyCode", each), ("exchange", "USD"), ("financialGroup", value), ("year1", a[0]), ("period1", a[1]), ("year2", b[0]), ("period2", b[1]), # 修正原代码笔误:[b1]改为b[1] ("year3", c[0]), ("period3", c[1]), ) # 修正原代码语法错误:json()需要加括号 req = requests.get(url, params=parameters).json()["value"] data = pd.DataFrame.from_dict(req) # 修正原代码语法错误:value'4'改为'value4' filteredData = data.filter(items=['itemDescEng', 'value1', 'value2', 'value3', 'value4']) # 给每个itemDescEng的重复行添加序号,生成唯一标识 filteredData['dup_idx'] = filteredData.groupby('itemDescEng').cumcount() # 设置复合索引,确保重复行也能精准匹配 filteredData.set_index(['itemDescEng', 'dup_idx'], inplace=True) stockData.append(filteredData) # 按复合索引合并,自动对齐所有行,缺失行填充NaN df = pd.concat(stockData, axis=1) # 将缺失值替换为0 df.fillna(0, inplace=True) # 还原索引,恢复原有数据结构 df.reset_index(inplace=True) # 可选择删除辅助序号列,根据需求保留或移除 df.drop(columns=['dup_idx'], inplace=True)
关键步骤说明
- 添加重复行序号:通过
groupby('itemDescEng').cumcount()为每个重复的itemDescEng行分配递增序号,确保同一描述的重复行有唯一标识。 - 设置复合索引:用
itemDescEng+序号作为复合索引,让每个行都有唯一的定位键,避免合并时重复行错位。 - 索引对齐合并:
pd.concat(axis=1)会自动按照复合索引对齐所有DataFrame,缺失的索引行将填充NaN,最后用fillna(0)替换为0即可。
内容的提问来源于stack exchange,提问作者Gun
相关产品推荐
相关产品推荐

