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

时间:2014-07-29 17:54:09

标签: 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     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}}即使它没有被使用)

我最终想要的是

Error binding parameter 1 - probably unsupported type.

但是当我使用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

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

那么,还有另一种方法可以做到这一点,而不是pandasql或循环遍历数据帧的所有列/行吗?

1 个答案:

答案 0 :(得分:2)

如果您的数据框已经匹配,concat inner选项会为您处理吗?

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]]是为了避免重复ABC

无论如何,这可能是一个更好,更通用的解决方案:

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