python - 如何同时连接和填充?

标签 python pandas

假设我有三个数据框:

from pandas import DataFrame

df1 = DataFrame([
    [1],
    [3],
    [4]
],
    index=[1, 3, 4],
    columns=['value1']
)

df2 = DataFrame([
    [5],
    [6],
    [7],
],
    index=[5, 6, 7],
    columns=['value2']
)

df3 = DataFrame([
    [5, 9],
    [6, 10],
    [7, 11],
    [8, 12]
],
    index=[5, 6, 7, 8],
    columns=['value1', 'value2']
)

使用

concat([df1, df2, df3], sort=True, axis=1)

现在给我

   value1  value2  value1  value2
1     1.0     NaN     NaN     NaN
3     3.0     NaN     NaN     NaN
4     4.0     NaN     NaN     NaN
5     NaN     5.0     5.0     9.0
6     NaN     6.0     6.0    10.0
7     NaN     7.0     7.0    11.0
8     NaN     NaN     8.0    12.0

现在,我怎样才能得到结果

   value1  value2
1     1.0     NaN
3     3.0     NaN
4     4.0     NaN
5     5.0     5.0
6     5.0     6.0
7     7.0     7.0
8     8.0     12.0

也就是说,对于同名的列,如何将它们“向左”合并?我正在寻找一个通用的解决方案,它可以接受任意数量的具有相同名称的多个列(以及仅出现一次的列名称)。

最佳答案

使用DataFrame.combine_first :

df = df1.combine_first(df2).combine_first(df3)
print (df)
   value1  value2
1     1.0     NaN
3     3.0     NaN
4     4.0     NaN
5     5.0     5.0
6     6.0     6.0
7     7.0     7.0
8     8.0    12.0

使用DataFrames列表更通用的解决方案是使用 reduce :

from functools import reduce

dfs = [df1, df2, df3]
df = reduce(lambda l,r: pd.DataFrame.combine_first(l,r), dfs)

关于python - 如何同时连接和填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51193654/

相关文章:

python-3.x - 基于语义相似度的聚类不返回值

python - 将 bool 值转换为自定义字符串

python - 如何将文件上传到 Django 中的特定文件夹?

python - 在 python 中,我可以以某种方式使用 # %% 作为 VS Code 大纲中的顶级层次结构吗?

python - 热图未加载 seaborn 和 pandas 数据框

python - 使用 Pandas 基于正则表达式分离列数据

python - 正则表达式匹配两个词

python - 从文本文件导入列表以使用 isin() 与数据帧进行比较

python - 如何使用不同的条件填充缺失值

python - 在 Windows 和 UNIX 上使用 Pandas 从子目录读取 CSV