python - 将多个数据帧与互补缺失值组合起来的最有效方法

标签 python pandas dataframe

这可能是一个非常基本的问题。假设我有两个数据框:

>>> df1
   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3   NaN
4   4   NaN
5   5   NaN

>>> df2
   id     a
0   0   NaN
1   1   NaN
2   2   NaN
3   3  20.0
4   4  25.0
5   5  30.0


我想加入 id 上的数据框,看起来像:

>>> df_joined
   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0

到目前为止,我一直在进行左合并,例如df1.merge(df2, how = 'left', on = 'id) 但这会导致重复的列(见下文),我必须通过填充 nans、重命名列,然后删除重复项。如果我要合并 2 个以上的数据框,这将变得特别乏味。

# How do I better merge this so I don't have fill nans, rename, and drop the columns?
   id   a_x   a_y
0   0   5.0   NaN
1   1  10.0   NaN
2   2  15.0   NaN
3   3   NaN  20.0
4   4   NaN  25.0
5   5   NaN  30.0

执行此操作的更好方法是什么?

最佳答案

IIUC,DataFrame.combine_first

df1.combine_first(df2)

   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0

编辑

我们可以使用DataFrame.set_index + DataFrame.combine_first mapreduce 用于 n DataFrames。

my_list_df = [df1, df2]

from functools import reduce
reduce(lambda new_df,  df_to_combine: new_df.combine_first(df_to_combine), 
       map(lambda df: df.set_index('id'), my_list_df)).reset_index()

输出

   id     a
0   0   5.0
1   1  10.0
2   2  15.0
3   3  20.0
4   4  25.0
5   5  30.0

在这种情况下我们只需要reduce:

reduce(lambda new_df, df_to_combine: new_df.combine_first(df_to_combine.set_index('id')),
       my_list_df[1:], my_list_df[0].set_index('id')).reset_index()

关于python - 将多个数据帧与互补缺失值组合起来的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61621816/

相关文章:

python - Django : How to override the CSRF_FAILURE_TEMPLATE

python - 如何在 pandas 数据框中应用递归数字过滤器?

python - 使用循环将两个 Pandas 系列按列附加到数据框

Python Pandas 添加 DataRow 修订号

Python3 数据帧多重分隔符

r - R中data.frames的expand.grid函数

python - 汇总分组 Pandas 数据框中的行并返回 NaN

python - 我的 Mac OS X Mountain Lion 上有太多 python

Python 多处理提前终止

python - 在 django 中上传时使用 pil 调整图像大小