编辑:已经实现我可能已经问过一个非常类似的问题,测试一下该解决方案是否有效。
有没有办法在不使用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
或循环遍历数据帧的所有列/行吗?
答案 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]]
是为了避免重复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