【问题标题】:Pandas join (merge?) dataframes, keep only unique indiciesPandas 加入(合并?)数据框,只保留唯一索引
【发布时间】:2019-07-18 01:32:15
【问题描述】:

我有一个带有日期索引的数据框。有几个日期不知何故丢失了。我将其称为数据框A。我有另一个包含相关日期的数据框。我将此数据框称为B

我想合并两个数据框:

保留A 的所有索引并将其与B 连接,但我不希望B 中的任何行与A 共享索引。也就是说,我只想要从B 返回的A 中缺少的行。

这如何最容易实现?

注意:

对于我拥有的数据数据库,这种行为是正确的。我会做大约 400 次。

【问题讨论】:

    标签: pandas dataframe join merge


    【解决方案1】:

    如果我没看错,你想要的是

    B[~B.index.isin(A.index)]
    

    例如:

    In [192]: A
    Out[192]:
    Empty DataFrame
    Columns: []
    Index: [1, 2, 4, 5]
    
    In [193]: B
    Out[193]:
    Empty DataFrame
    Columns: []
    Index: [1, 2, 3, 4, 5]
    
    In [194]: B[~B.index.isin(A.index)]
    Out[194]:
    Empty DataFrame
    Columns: []
    Index: [3]
    

    要使用来自A 的数据,否则从B 获取数据,您可以这样做

    pd.concat([A, B[~B.index.isin(A.index)]).sort_index()
    

    或者,假设 A 不包含您想要保留的空元素,您可以采取不同的方法并采用类似的方法

    pd.DataFrame(A, index=B.index).fillna(B)
    

    【讨论】:

    • 这基本上就是我想要的。然后,一旦 B 以这种方式被索引,我就可以合并两个 DataFrame。
    • 我真的不明白你所说的“合并”是什么意思。根据索引的定义,A 没有数据可取,因此没有可合并的数据。
    • 我真的不希望它们“合并”,这就是为什么我不确定该帖子的标题。但我希望将它们连接起来然后排序(是的,我知道熊猫可以连接并且会对索引进行排序)。但由于缺乏简洁的术语,我写了“合并”
    • 那么,如果有A 的数据,就使用它,如果没有,就使用B 的数据吗?
    • @jezrael:谢谢,有道理;聪明的。猜猜它会花费更多的内存,但很可能不会有什么不同。让我在答案中添加其他方法。
    【解决方案2】:

    我相信你需要Index.difference:

    B.loc[B.index.difference(A.index)]
    

    编辑:

    A = pd.DataFrame({'A':range(10)}, index=pd.date_range('2019-02-01', periods=10))
    B = pd.DataFrame({'A':range(10, 20)}, index=pd.date_range('2019-01-27', periods=10))
    

    df = pd.concat([A, B.loc[B.index.difference(A.index)]]).sort_index()
    print (df)
                 A
    2019-01-27  10
    2019-01-28  11
    2019-01-29  12
    2019-01-30  13
    2019-01-31  14
    2019-02-01   0
    2019-02-02   1
    2019-02-03   2
    2019-02-04   3
    2019-02-05   4
    2019-02-06   5
    2019-02-07   6
    2019-02-08   7
    2019-02-09   8
    2019-02-10   9
    

    df1= pd.concat([A, B])
    df1 = df1[~df1.index.duplicated()].sort_index()
    print (df1)
                 A
    2019-01-27  10
    2019-01-28  11
    2019-01-29  12
    2019-01-30  13
    2019-01-31  14
    2019-02-01   0
    2019-02-02   1
    2019-02-03   2
    2019-02-04   3
    2019-02-05   4
    2019-02-06   5
    2019-02-07   6
    2019-02-08   7
    2019-02-09   8
    2019-02-10   9
    

    【讨论】:

      【解决方案3】:

      虽然已经有了很好的答案,但我想分享这个,因为它太短了

      pd.concat([A, B]).drop_duplicates(keep='first')
      

      【讨论】:

      • 这是个好主意。过去我使用过非常相似的东西来满足其他需求,我很惊讶我没有想到这一点。我想我只是认为应该有一个“连接”来只从两个数据集中获取唯一的元素(但是……我知道那不是真正的“连接”)。也许我会先试试这个。
      • 这个答案的问题是需要按索引删除重复项,所以不能使用.drop_duplicates(keep='first'),因为它删除了所有列的重复项,不确定是否需要它。如果需要按索引删除重复项需要df1 = df1[~df1.index.duplicated()].sort_index(),请检查我的答案以获取示例数据的解决方案。
      • @jezrael 我没有意识到每列都会应用这种行为。了解这一点很有帮助。
      猜你喜欢
      • 2012-11-14
      • 2013-12-03
      • 2014-09-01
      • 2018-10-30
      • 2013-09-08
      • 2020-06-02
      • 2019-02-06
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多