[英]Filter dataframe by line row
嗨,我是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)一起使用,但是我會有錯誤的列,如何作為過濾器呢?
使用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
這是沒有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
您可以通過將所需的列轉換為字典(方向設置為list
從df2
進行過濾,然后使用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
您需要一個內部聯接,它看起來像:保留僅在兩個目錄中都存在的行:
df1.join(df2, how='inner')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.