【问题标题】:filtering rows in one dataframe based on two columns of another dataframe根据另一个数据帧的两列过滤一个数据帧中的行
【发布时间】:2021-09-17 14:52:33
【问题描述】:

我有两个数据框。一个数据框 (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 广播,因为我遇到了内存错误。有没有办法在熊猫框架内处理这个问题。我们将不胜感激。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    如果您有那么多行,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
    

    【讨论】:

    • 我同意@mozway,如果你在 dfB 上也有一个 ID 会更好,这样你就可以合并它。
    • 对不起!我没有看到你的答案,但似乎我们的答案完全一样:)
    • @Mozway 我有许多具有相同名称的行。我总共有 25 个名字。
    • 不,但有趣的是我们的答案有多么相似:)
    • @mozway,如果熊猫可能不是最佳的前进方式,你建议我如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多