Skip to main content
 首页 » 编程设计

python之映射多个数据框的值并填充列

2025年05月04日11softidea

假设我有以下三个数据框:

数据框 1:

df1 = {'year': ['2010','2012','2014','2015'], 'count': [1,1,1,1]} 
df1 = pd.DataFrame(data=df1) 
df1 = df1.set_index('year') 
df1 
 
year    count 
2010    1 
2012    1 
2014    1 
2015    1 

数据框 2:

df2 = {'year': ['2010','2011','2016','2017'], 'count': [2,1,3,1]} 
df2 = pd.DataFrame(data=df2) 
df2 = df2.set_index('year') 
df2 
 
year    count 
2010    2 
2011    1 
2016    3 
2017    1 

数据框 3:

df3 = {'year': ['2010','2011','2012','2013','2014','2015','2017'], 'count': [4,2,5,4,4,1,1]} 
df3 = pd.DataFrame(data=df3) 
df3 = df3.set_index('year') 
df3 
 
year    count 
2010    4 
2011    2 
2012    5 
2013    4 
2014    4 
2015    1 
2017    1 

现在我想要三个包含所有年份和计数的数据框。例如,如果 df1 缺少年份 2011、2013、2016、2017,那么这些年份将添加到 df1 的索引中,每个新添加的索引的计数都为 0。

所以对于 df1,我的输出应该是这样的:

year    count 
2010    1 
2012    1 
2014    1 
2015    1 
2011    0 
2013    0 
2016    0 
2017    0 

对于 df2 和 df3 也是如此。谢谢。

请您参考如下方法:

您可以使用 union与 reindex :

idx = df1.index.union(df2.index).union(df3.index) 
print (idx) 
Index(['2010', '2011', '2012', '2013',  
       '2014', '2015', '2016', '2017'], dtype='object', name='year') 

另一种解决方案:

from functools import reduce 
idx = reduce(np.union1d,[df1.index, df2.index, df3.index]) 
print (idx) 
 
['2010' '2011' '2012' '2013' '2014' '2015' '2016' '2017'] 

df1 = df1.reindex(idx, fill_value=0) 
print (df1) 
      count 
year        
2010      1 
2011      0 
2012      1 
2013      0 
2014      1 
2015      1 
2016      0 
2017      0 
df2 = df2.reindex(idx, fill_value=0) 
print (df2) 
      count 
year        
2010      2 
2011      1 
2012      0 
2013      0 
2014      0 
2015      0 
2016      3 
2017      1 
df3 = df3.reindex(idx, fill_value=0) 
print (df3) 
      count 
year        
2010      4 
2011      2 
2012      5 
2013      4 
2014      4 
2015      1 
2016      0 
2017      1