具有相同索引和不同列大小的数据帧连接



如何连接一个数据帧字典(每个数据帧的索引以0开头)?因此,存在不同列大小的重复索引。也就是说,一些df有一些缺失的列,而一些df包含所有的列。

下面是一个例子:

df1

idx col1 col2 col3
0    1     1    1
1    2     2    2

df2

idx col1 col3 
0    1     1    
1    2     2    

df3

idx col1 col2 col3
0    1     1    1
1    2     2    2

desired_result

idx col1 col2 col3
0    1     1    1
1    2     2    2
2    1     nan  1
3    2     nan  2
4    1     1    1
5    2     2    2

所以我想用nan填充这些列,并将其重塑为包含所有列的数据框架。

提前感谢!

考虑到数据帧的字典如下所示

df_dict = {
'df1': pd.DataFrame({'idx': [1, 2], 'col1': [1, 2], 'col2': [1, 2], 'col3': [1, 2]}),
'df2': pd.DataFrame({'idx': [1, 2], 'col1': [1, 2], 'col3': [1, 2]}),
'df3': pd.DataFrame({'idx': [1, 2], 'col1': [1, 2], 'col2': [1, 2], 'col3': [1, 2]})
}

可以简单地使用pandas.concat如下

df = pd.concat(df_dict.values(), ignore_index=True)
[Out]:
idx  col1  col2  col3
0    1     1   1.0     1
1    2     2   2.0     2
2    1     1   NaN     1
3    2     2   NaN     2
4    1     1   1.0     1
5    2     2   2.0     2

如果想将idx列作为索引,可以按如下方式传递pandas.DataFrame.set_index

df = pd.concat(df_dict.values(), ignore_index=True).set_index('idx')
[Out]:
col1  col2  col3
idx                  
1       1   1.0     1
2       2   2.0     2
1       1   NaN     1
2       2   NaN     2
1       1   1.0     1
2       2   2.0     2

指出:

  • 如果不希望col2float64(遵循此用户的评论),一种方法是使用pandas.Int64Dtype,如下所示

    df['col2'] = df['col2'].astype(pd.Int64Dtype())
    [Out]:
    idx  col1  col2  col3
    0    1     1     1     1
    1    2     2     2     2
    2    1     1  <NA>     1
    3    2     2  <NA>     2
    4    1     1     1     1
    5    2     2     2     2
    

最新更新