【问题标题】:identifying which rows are present in another dataframe识别另一个数据框中存在哪些行
【发布时间】:2016-05-04 03:40:46
【问题描述】:

我有两个数据框 df1 和 df2,有人告诉我它们共享一些行。也就是说,对于某些索引, (i,j)_n df1.loc[i] == df2.loc[j] 完全正确。我想找到这个信件。

这是一个棘手的问题。我不想“手动”查询每一行的每一列,所以我一直在寻找更干净的东西。

这是我拥有的最好的,但速度不快。我希望一些大师能指出我正确的方向。

matching_idx=[]
for ix in df1.index:
    match =df1.loc[ix:ix].to_dict(orient='list')
    matching_idx.append( df2.isin(match).all(axis=1)  )

摆脱 for 循环会很好,但我不确定这是否可能。

【问题讨论】:

    标签: python-2.7 pandas


    【解决方案1】:

    假设每个数据帧中的行是唯一的,您可以连接两个数据帧并搜索重复项。

    df1 = pd.DataFrame({'A': ['a', 'b'], 'B': ['a', 'c']})    
    df2 = pd.DataFrame({'A': ['c', 'a'], 'B': ['c', 'a']})
    
    >>> df1
       A  B
    0  a  a
    1  b  c
    
    >>> df2
       A  B
    0  c  c
    1  a  a
    
    df = pd.concat([df1, df2])
    
    # Returns the index values of duplicates in `df2`.
    >>> df[df.duplicated()]
       A  B
    1  a  a
    
    # Returns the index value of duplicates in `df1`.
    >>> df[df.duplicated(keep='last')]
       A  B
    0  a  a
    

    【讨论】:

    • 我相信 PYOak 在简单性方面击败了你
    • 但是您丢失了包含重复项的行的索引位置。请注意,第一个示例的索引位于 1,即 df1 中 dup 的位置。第二个示例索引在0,即df2中dup的位置
    • 啊,你是对的。即使我正在实施 PYOak 的解决方案,我也会为您提供最佳答案的正确答案
    【解决方案2】:

    您可以进行合并所有列的合并:

    match = df1.merge(df2, on=list(df1.columns))
    

    【讨论】:

    • 我很尴尬地尝试了很长时间试图让“合并”工作......搞砸了“指标”,“内部”和“on_left”等等等。非常感谢寻求解决方案!
    猜你喜欢
    • 2019-09-20
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多