我想将右侧 table 的非 na 行合并到左侧 table

I would like to merge the non-na rows of a right table to a left table

我有一个数据框列表,我想将它们合并到一个单一的数据框中。每个数据框都包含相同数量的行和列,以及相同的列名。但是,一些数据帧包含许多值和一些非 NA 值。我想遍历 df 的列表并将右侧 table 的非值合并到左侧 table,无论左侧 table 是否具有该索引处的值。

我的数据如下所示

A B  C       A B  C
1 t 5.0      1 t <NA>
2 n 2.0      2 n <NA>
3 z 3.0      3 z 2.0
4 m <NA>     4 m 4.0
5 j 1.0      5 j <NA>

我尝试使用 pd.concat 和表达式中包含的过滤条件合并数据帧列表:

table_of_dfs = [df1, df2, df3, df4, df5]
merged_table = pd.concat(table_of_dfs[i].merge(table_of_dfs[i+1][~table_of_dfs[i+1].isnull().T.any().T], on=['A','B','C'], how='left') for i in range(len(table_of_dfs) - 1))

我想要的结果:

A B  C 
1 t 5.0  
2 n 2.0     
3 z 2.0     
4 m 4.0  
5 j 1.0      

我的实际结果:

    A B  C  
    1 t 5.0  
    2 n 2.0    
    3 z 3.0    
    4 m <NA> 
    5 j 1.0 
    6 t <NA>
    7 n <NA>
    8 z 2.0
    9 m 4.0
   10 j <NA>

我们称您为数据帧 df1 和 df2。您可以使用 where 替换 NaN 值:

df2['C'] = df1['C'].where(df2['C'].isna(), df2['C'])

使用 functools 模块中的 combine_firstreduce

from functools import reduce
dfs = [df1, df2, df3]

>>> reduce(lambda dfA, dfB: dfB.combine_first(dfA), dfs)
   A  B    C
0  1  t  5.0
1  2  n  2.0
2  3  z  2.0
3  4  m  4.0
4  5  j  6.0
5  6  p  9.0

数据:

>>> df1
   A  B    C
0  1  t  5.0
1  2  n  2.0
2  3  z  3.0
3  4  m  NaN
4  5  j  1.0

>>> df2
   A  B    C
0  1  t  NaN
1  2  n  NaN
2  3  z  2.0
3  4  m  4.0
4  5  j  NaN

>>> df3
   A  B    C
0  1  t  5.0
1  2  n  NaN
2  3  z  2.0
3  4  m  4.0
4  5  j  6.0
5  6  p  9.0  # added a new row