繁体   English   中英

如何在2个数据框之间的2列中查找具有相同值但在其他列pandas中具有不同值的行

[英]How to find row with same value in 2 columns between 2 dataframes but different values in other columns pandas

我有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

感谢帮助。

这是使用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']))

我认为您可以使用:

#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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM