您好我是初学者python用户,我需要一些帮助。我试图将一个数据帧与另一个数据帧进行过滤。
DF1
date emp# sku transaction#
2017-01-01 10 200 399
2017-01-01 10 201 399
2017-01-01 10 202 399
2017-01-01 11 203 399
2017-01-01 11 200 399
DF2
date emp# sku transaction#
2017-01-01 10 200 301
2017-01-01 11 200 301
所需 DF1
date emp# sku transaction#
2017-01-01 10 200 399
2017-01-01 11 200 399
我知道这可以使用内连接(一个emp#和sku)但我会有错误的列,我怎么能这样做一个过滤器?
答案 0 :(得分:2)
使用merge
和on
参数:
Df1.merge(Df2, on=['date','emp#','sku'], suffixes=('','_y'))\
.drop('transaction#_y', axis=1)
输出:
date emp# sku transaction#
0 2017-01-01 10 200 399
1 2017-01-01 11 200 399
答案 1 :(得分:1)
这是没有pd.merge
的一种方法。这种方法的好处是你不必使用列名。
df2 = df2.set_index(['emp#', 'sku'])
df2['transaction#'] = df1.set_index(['emp#', 'sku'])['transaction#']
df2 = df2.reset_index()
# emp# sku date transaction#
# 0 10 200 2017-01-01 399
# 1 11 200 2017-01-01 399
答案 2 :(得分:0)
您可以通过将所需的列转换为字典(方向设置为df2
),从list
进行过滤,然后使用isin
签入存在的值。最后,取每行的min
以确保满足两个条件,即
False
+ False
= False
False
+ True
= False
True
+ False
= False
True
+ True
= True
cols = ['emp#','sku']
df1[df1[cols].isin(df2[cols].to_dict(orient='list')).min(1)]
date emp# sku transaction#
0 2017-01-01 10 200 399
4 2017-01-01 11 200 399
答案 3 :(得分:-1)
您需要一个内部联接,它看起来像:保持仅在两者中的行:
df1.join(df2, how='inner')