如何从不同数据帧的两列中找到相似的值?

问题描述 投票:-1回答:1

例如,我有两个看起来像这样的数据框

df1
c1           c2   c3   c4   c5   c6   c7
2006-01-02 10:45 xxx0 yyy0 zzz0 rrr0 sss0
2006-01-02 11:00 xxx1 yyy1 zzz1 rrr1 sss1
2006-01-03 11:15 xxx2 yyy2 zzz2 rrr2 sss2
2006-01-03 11:30 xxx3 yyy3 zzz3 rrr3 sss3
2006-01-04 11:45 xxx4 yyy4 zzz4 rrr4 sss4
2006-01-05 11:00 xxx5 yyy5 zzz5 rrr5 sss5

df2
c1           c2     c3   c4 
2006-01-02  10:45  aaa0 bbb0 
2006-01-03  11:30  aaa1 bbb1
2006-01-04  10:40  aaa2 bbb2
2006-01-05  11:00  aaa3 bbb3

我想编辑df1的两列,以使其包含df1和df2的c1和c2列中共有的值

输出:

df1
c1           c2   c3   c4   c5   c6   c7
2006-01-02 10:45 xxx0 yyy0 zzz0 rrr0 sss0
2006-01-03 11:30 xxx3 yyy3 zzz3 rrr3 sss3
2006-01-05 11:00 xxx5 yyy5 zzz5 rrr5 sss5

我尝试过的是这个

dfnewdate = df1[(df1[c1].isin(df2[c1])]
df1 = dfnewdate
dfnewtime = df1[(df1[c2].isin(df2[c2])]
df1 = dfnewtime

它已成功滤除日期,但它省略了df1的第一行并且没有滤除时间(它仍然具有旧的df1的第二行)。

My output
df1
c1           c2   c3   c4   c5   c6   c7
2006-01-02 10:45 xxx0 yyy0 zzz0 rrr0 sss0
2006-01-02 11:00 xxx1 yyy1 zzz1 rrr1 sss1
2006-01-03 11:15 xxx2 yyy2 zzz2 rrr2 sss2
2006-01-03 11:30 xxx3 yyy3 zzz3 rrr3 sss3
2006-01-05 11:00 xxx5 yyy5 zzz5 rrr5 sss5

我的代码有问题吗?有没有其他方法可以做到这一点?

python pandas dataframe
1个回答
0
投票

有很多方法可以做到这一点。我给你看三个。

1)使用.loc.isin()

df1.loc[(df1['c1'].isin(df2['c1']))&(df1['c2'].isin(df2['c2']))]

2)使用.join()(在将每个列设置为索引时使用内部联接,可以很容易地使用.merge

df1.set_index(['c1','c2']).join(df2.set_index(['c1','c2']), how = 'inner').reset_index()

3)将pd.concat().duplicated()一起使用。在这里,您将df列明智地组合在一起,然后查找重复的行。

df3 = pd.concat([df1,df2])
df3[df3.duplicated()]
© www.soinside.com 2019 - 2024. All rights reserved.