簡體   English   中英

按行過濾數據框

[英]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)一起使用,但是我會有錯誤的列,如何作為過濾器呢?

使用mergeon參數:

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

您可以通過將所需的列轉換為字典(方向設置為listdf2進行過濾,然后使用isin檢查值是否存在。 最后,取每一行的min以確保同時滿足兩個條件,即

  1. False + False = False
  2. False + True = False
  3. True + False = False
  4. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM