例如,我有两个看起来像这样的数据框
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
我的代码有问题吗?有没有其他方法可以做到这一点?
有很多方法可以做到这一点。我给你看三个。
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()]