我想将右侧 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_first
和 reduce
:
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
我有一个数据框列表,我想将它们合并到一个单一的数据框中。每个数据框都包含相同数量的行和列,以及相同的列名。但是,一些数据帧包含许多值和一些非 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_first
和 reduce
:
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