【问题标题】:Find identical rows between two xlsx files在两个 xlsx 文件之间查找相同的行
【发布时间】:2017-12-29 11:43:28
【问题描述】:

我刚刚看了几个帖子,但我没有找到解决方案。

我正在尝试使用 Python 中的 Pandas 比较不同工作簿中的 2 个 Excel 文件。

工作1:

A     B     C
1     1     1
2     2     2
3     3     3

工作2:

A     B     C
1     1     1
2     5     2
3     3     3

希望输出:

A     B     C
1     1     1

3     3     3

到目前为止,我得到的是:

import pandas as pd

df1 = pd.read_excel('/path/work1.xlsx')
df2 = pd.read_excel('/path/work2.xlsx')

common = df1[df1==df2]
print common
common.to_excel('/path/result.xlsx')

但我得到的是:

A     B     C
1     1     1
2           2
3     3     3

重点是,如果work1的B列和work2有任何重合,那么输出应该只有整行重合。

我正在使用 NGS 变异注释,因此有助于分析共享变异的受影响家族。

【问题讨论】:

    标签: python pandas dataframe compare


    【解决方案1】:

    您需要做的是编写条件以在一行中找到 所有 列相等。到目前为止,您生成的掩码与原始数据帧的形状相同,因此当您编制索引时,您会创建 NaN,而不是像应有的那样进行过滤。

    选项 1
    使用eq + all -

    df1[df1.eq(df2).all(axis=1)]
    
       A  B  C
    0  1  1  1
    2  3  3  3
    

    请记住,pandas 在比较时会按索引自动对齐数据框,因此如果您的数据框在索引或列方面不完全相同,这将不起作用。如果是这种情况,则需要进行一些预处理。

    df2.index = df1.index
    df2.columns = df1.columns
    

    现在,这(以及合并)应该可以工作了。


    选项 2
    所有列上的内部merge -

    df1.merge(df2)
    
       A  B  C
    0  1  1  1
    1  3  3  3
    

    【讨论】:

    • 太棒了!谢谢!我用一个大文件试了一下,只取了前 9 行。所以我把它复制到2个文件中。如果它是正确的应该返回我所有的 9 行,那么它只返回最后 2 行,我不知道为什么。然后我修改了其中一个,它只返回 1。所以我不知道其他的会是什么
    • @IgorLopez 检查您的索引和列,问题可能就在那里。
    • @COLDSPEED 感谢并原谅我对 pandas 的无知,但如果我使用 2 个相同的文件,这怎么可能?
    • @IgorLopez 您能否将有问题的数据框复制并粘贴到您的问题中,以便我查看它们?
    • @IgorLopez 如果您的问题没有得到解答,请使用有关答案不起作用的原因的更多信息来解决您的问题。否则,如果答案有效,请将其标记为已接受。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2019-11-10
    • 2014-02-02
    相关资源
    最近更新 更多