在python中获取两个数据帧之间的匹配

在python中获取两个数据帧之间的匹配,python,python-2.7,pandas,Python,Python 2.7,Pandas,编辑:意识到我可能已经问了一个非常类似的问题,测试这个解决方案是否有效 是否有一种方法可以从两个数据帧中获取匹配项,而无需使用pandas.merge 我一直在使用:pd.merge(dfa,dfb,on=('A','B','C'),how='right'),但它并没有按照我的预期工作 我有两个数据帧,一个是这样的: A B C w 1 1 b 1 2 c 3 1 c 3 1 第二个看起来像 A B

编辑:意识到我可能已经问了一个非常类似的问题,测试这个解决方案是否有效

是否有一种方法可以从两个数据帧中获取匹配项,而无需使用
pandas.merge

我一直在使用:
pd.merge(dfa,dfb,on=('A','B','C'),how='right')
,但它并没有按照我的预期工作

我有两个数据帧,一个是这样的:

A     B     C
w     1     1
b     1     2
c     3     1
c     3     1
第二个看起来像

A     B     C    D
w     1     1    1/1/14
b     1     2    1/3/14
c     3     1    1/7/14
c     3     1    1/7/14
d     4     7    1/7/14
z     5     3    1/8/14
第一个数据帧已通过使用
pandasql
的查询运行,并且由于某种原因
pandasql
无法处理日期,即使这些日期没有在查询中使用(我得到
错误绑定参数1-可能是不支持的类型。
,即使没有使用)

我最终想要的是

A     B     C    D
w     1     1    1/1/14
b     1     2    1/3/14
c     3     1    1/7/14
c     3     1    1/7/14
但是当我使用pandas.merge时,我最终得到了

A     B     C    D
w     1     1    1/1/14
b     1     2    1/3/14
c     3     1    1/7/14
c     3     1    1/7/14
c     3     1    1/7/14
c     3     1    1/8/14
无论我是使用“内部”、“右侧”还是“左侧”表示“如何”

我希望我能够使用
pandasql
并通过某种日期解析选项跳过所有这些,但我似乎找不到任何选项


那么,有没有另一种方法不是熊猫。合并或循环遍历数据帧的所有列/行?

如果您的数据帧已经匹配,那么
concat
内部
选项会为您处理这个问题吗

In [46]:

print pd.concat((df1, df2), join='inner', axis=1)[[0,1,2,-1]]
   A  B  C       D
0  w  1  1  1/1/14
1  b  1  2  1/3/14
2  c  3  1  1/7/14
3  c  3  1  1/7/14
[[0,1,2,-1]
是为了避免重复
A
B
C

无论如何,这可能是一个更好、更普遍的解决方案:

In [90]:

print pd.merge(df1.drop_duplicates(subset=['A', 'B', 'C']),
               df2, on=['A','B','C'])
   A  B  C       D
0  w  1  1  1/1/14
1  b  1  2  1/3/14
2  c  3  1  1/7/14
3  c  3  1  1/7/14

有时候。当df1只有一行时不起作用,但除此之外似乎还起作用。我们将用更多的数据进行测试,但似乎是答案。谢谢事实上,我正要删除它,因为除非
A
B
C
已经匹配,否则它将无法工作。但我们稍后再来讨论。我真的怀疑问题是由于重复的行。到目前为止,它实际上对我有效。我其他尝试的问题都是重复的,每次匹配两次,结果是4次而不是2次。我只是用更一般的解决方案编辑了答案<代码>删除重复的一次
df
将绕过它。