我有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
感谢您的帮助。
答案 0 :(得分:0)
以下是使用duplicated
和drop_duplicates
的解决方案。首先必须连接两个数据帧,为此必须确保列名相同。
如果您的列名实际上与df2
和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']))
的列名而不修改原始数据框,则只需添加以下步骤:
{{1}}
答案 1 :(得分:0)
我认为你可以使用:
#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