[英]Creat a new dataframe that has two columns of one dataframe when some rows matches with another dataframe
[英]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.