【问题标题】:How to find row with same value in 2 columns between 2 dataframes but different values in other columns pandas如何在2个数据框之间的2列中找到具有相同值但在其他列pandas中具有不同值的行
【发布时间】:2018-05-12 13:19:50
【问题描述】:

我有 2 个数据框,示例值如下:

df1 :
col1 cold2 cold3 cold4
a     bb    cc    d
b     aa    ee    e


df2 :
col1 cold2 cold3 col4
a    ee    ff    d
e    gg    hh    k

我想找到 2 个数据帧中的所有行在 col1+col4 中具有相同的值,但在 col2 或 col3 中具有不同的值

输出应该是这样的:

df3:
col1 cold2 cold3 cold4
a     bb    cc    d
a     ee    ff    d

感谢您的帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是使用duplicateddrop_duplicates 的解决方案。您首先必须连接两个数据框,您必须确保列名相同。

    如果您的列名在df1df2 中实际匹配,请执行以下操作:

    new_df = (pd.concat([df1,df2])[pd.concat([df1,df2])
                                 .duplicated(subset=['col1','cold4'], keep=False)]
               .drop_duplicates(subset=['cold2', 'cold3']))
    

    返回:

    >>> new_df
    
      col1 cold2 cold3 cold4
    0    a    bb    cc     d
    0    a    ee    ff     d
    

    如果您需要重命名df2 中的列以匹配df1 的列名,而无需修改原始数据框,您只需添加此步骤即可:

    concat_dfs = pd.concat([df1, df2.rename(columns={i2:i1 for i1,i2
                                             in zip(df1.columns,df2.columns)})])
    
    new_df = (concat_dfs[concat_dfs.duplicated(subset=['col1', 'cold4'], keep=False)]
               .drop_duplicates(subset=['cold2', 'cold3']))
    

    【讨论】:

    • 嗨,我试过了,但它保留了所有记录,尽管值没有重复?? 2 个数据框之间的所有列名都匹配
    • 我试过了:df3 = (pd.concat([df1,df2])[pd.concat([df1,df2]) .duplicated(subset=['EMPLOYEE_NUMBER', 'EMAIL_ADDRESS'], keep=False)].drop_duplicates(subset=['LAST_NAME','FIRST_NAME','MIDDLE_NAME','BRANCH','DEPARTMENT','LEVEL','POSITION'], keep='last', inplace=False))
    【解决方案2】:

    我认为你可以使用:

    #get all matched rows by columns
    df = df1.merge(df2, on=['col1','col4'], suffixes=('','_'))
    #filter for not matched  
    df = df[df['col2'] != df['col3']]
    
    #filter columns - same like df1
    df1 = df[df1.columns]
    #filter added new columns
    df2 = df[df.columns.difference(df2.columns).union(['col1','col4'])]
    
    #join together - rename values for align data 
    df = pd.concat([df1, 
                    df2.rename(columns=dict(zip(df2.columns, df1.columns)))],
                    ignore_index=True)
    print (df)
      col1 col2 col3 col4
    0    a   bb   cc    d
    1    a   ee   ff    d
    

    【讨论】:

    • 你能解释一下这个df['col2'] != df['col3'] 吗?与更多列相比,我如何使用它??
    • 它被称为boolean indexing,如果想比较更多的列,有一种方法首先过滤所有没有一列的列,然后通过ne与这一列比较 - 不相等,然后检查所有值是否为@987654327 @s 每行 all(axis=1) - df = df[['col3', 'col4', 'another col']].ne(df['col2'], axis=0).all(axis=1)
    • @TuyenQuang - 我认为最好的方法是添加一些示例数据(我认为每个 DataFrame 5-8 行很好,minimal, complete, and verifiable example),然后添加预期的输出。因为似乎需要比较多为 2 列,所以解决方案应该不同
    • Ho Jerzael,我将 csv 文件导入数据帧,因此它们具有相同的列名.. 'EMPLOYEE_NUMBER', 'LAST_NAME', 'FIRST_NAME', 'MIDDLE_NAME', 'BRANCH', 'DEPARTMENT', 'LEVEL', 'POSITION', 'EMAIL_ADDRESS' 是列表列名。列中的值是文本和数字。谢谢
    • @TuyenQuang - 但我没有你的数据,你能编辑问题吗?
    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2021-09-15
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多