簡體   English   中英

根據另一個數據幀的兩列過濾一個數據幀中的行

[英]filtering rows in one dataframe based on two columns of another dataframe

我有兩個數據框。 一個數據框 (dfA) 如下所示:

Name    gender     start_coordinate    end_coordinate    ID      
Peter     M             30                  150           1      
Hugo      M            4500                6000           2      
Jennie    F             300                 700           3   

另一個數據框(dfB)看起來像

Name        position      string      
Peter         89            aa      
Jennie        568           bb     
Jennie        90            cc

我想從 dfA 過濾數據,使 dfB 的位置落在 dfA 的區間(開始坐標和結束坐標)中,並且名稱也應該相同。 例如,dfB 行#1 的位置值落在dfA 行#1 指定的區間內,相應的名稱值也相同,因此,我想要這一行。 相反,dfB 的第 3 行也落在 dfA 的第 1 行的間隔內,但名稱值不同,因此,我不想要此記錄。

因此,預期的結果變為:

##new_dfA
Name    gender     start_coordinate    end_coordinate    ID      
Peter     M             30                  150           1           
Jennie    F             300                 700           3 

##new_dfB
Name        position      string      
Peter         89            aa      
Jennie        568           bb     

實際上,dfB 的大小為 (443068765,10) 而 dfA 的大小為 (100000,3) 因此,我不想使用 numpy 廣播,因為我遇到了內存錯誤。 有沒有辦法在熊貓框架內處理這個問題。 見解將不勝感激。

如果你有那么多行,pandas 可能不太適合你的應用程序。

也就是說,如果沒有很多行具有相同的“名稱”,您可以merge “名稱”,然后過濾符合您條件的行:

dfC = dfA.merge(dfB, on='Name')
dfC = dfC[dfC['position'].between(dfC['start_coordinate'], dfC['end_coordinate'])]
dfA_new = dfC[df1.columns]
dfB_new = dfC[df2.columns]

輸出:

>>> dfA_new
     Name gender  start_coordinate  end_coordinate  ID
0   Peter      M                30             150   1
1  Jennie      F               300             700   3
>>> dfB_new
     Name  position string
0   Peter        89     aa
1  Jennie       568     bb

使用 pandasql

pd.sql("select df1.* from df1 inner join df2 on df2.name=df1.name and df2.position between df1.start_coordinate and df1.end_coordinate",globals())

   Name gender  start_coordinate  end_coordinate  ID
0   Peter      M                30             150   1
1  Jennie      F               300             700   3


pd.sql("select df2.* from df1 inner join df2 on df2.name=df1.name and df2.position between df1.start_coordinate and df1.end_coordinate",globals())

  Name  position string
0   Peter        89     aa
1  Jennie       568     bb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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