【问题标题】:Concat two DataFrames on missing indices在缺少的索引上连接两个 DataFrame
【发布时间】:2017-02-20 12:42:40
【问题描述】:

我有两个 DataFrame,并且只想在索引尚未包含在第一个中的行上使用第二个。

最有效的方法是什么?

示例:

df_1
idx     val
0      0.32
1      0.54
4      0.26
5      0.76
7      0.23

df_2
idx     val
1     10.24
2     10.90
3     10.66
4     10.25
6     10.13
7     10.52

df_final
idx     val
0      0.32
1      0.54
2     10.90
3     10.66
4      0.26
5      0.76
6     10.13
7      0.23

回顾:我需要在df_2 中添加索引不在df_1 中的行。


编辑

删除了df_2 中的一些索引,以说明df_1 中的所有索引都没有包含在df_2 中。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将reindexcombine_firstfillna 一起使用:

    df = df_1.reindex(df_2.index).combine_first(df_2)
    print (df)
           val
    idx       
    0     0.32
    1     0.54
    2    10.90
    3    10.66
    4     0.26
    5     0.76
    6    10.13
    7     0.23
    

    df = df_1.reindex(df_2.index).fillna(df_2)
    print (df)
           val
    idx       
    0     0.32
    1     0.54
    2    10.90
    3    10.66
    4     0.26
    5     0.76
    6    10.13
    7     0.23
    

    【讨论】:

    • 我没有在我的示例中说明这一点,但df_2 索引并未涵盖所有df_1 索引。因此这种方法不能按原样工作,它只需要出现在df_2 中的索引。
    • 我尝试测试它,对我来说它有效。您可以将其添加到我的解决方案中存在问题的示例中吗?谢谢。
    • 我有len(df) = len(df_2) 在运行您的任何一个解决方案时。在df_1 中但不在df_2 中的索引将被删除。
    • 我无法模拟它。我尝试相同的length,对我来说它有效。我不知道是什么问题:(
    • @Jivan 你可以使用df_final = df_1.combine_first(df_2)来达到想要的结果。
    【解决方案2】:

    您可以通过使用 DataFrame 的combine_first 方法来实现所需的输出。来自方法的文档:

    合并两个 DataFrame 对象,并在调用方法的框架中默认为非空值。结果索引列将是各个索引和列的并集

    示例用法:

    import pandas as pd
    
    df_1 = pd.DataFrame([0.32,0.54,0.26,0.76,0.23], columns=['val'], index=[0,1,4,5,7])
    df_1.index.name = 'idx'
    
    df_2 = pd.DataFrame([10.56,10.24,10.90,10.66,10.25,10.13,10.52], columns=['val'], index=[0,1,2,3,4,6,7])
    df_2.index.name = 'idx'
    
    df_final = df_1.combine_first(df_2)
    

    这将给出预期的结果:

    In [7]: df_final
    Out[7]:
           val
    idx       
    0     0.32
    1     0.54
    2    10.90
    3    10.66
    4     0.26
    5     0.76
    6    10.13
    7     0.23
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 2018-10-15
      • 2022-01-12
      • 2023-01-13
      • 2013-02-19
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      相关资源
      最近更新 更多