【问题标题】:Multiply columns based on two columns conditions from different dataframes?根据来自不同数据帧的两列条件将列相乘?
【发布时间】:2019-10-04 16:47:38
【问题描述】:

我有两个数据框,如下所示:

dfA = 
Country      City           Pop
US           Washington     1000
US           Texas          5000
CH           Geneva         500
CH           Zurich         500


dfB = 
Country      City           Density (pop/km2)
US           Washington     10
US           Texas          50
CH           Geneva         5
CH           Zurich         5

我想要的是比较两个数据帧中的 CountryCity 列,以及当它们匹配时,例如:

US Washington & US Washington 在两个数据帧中,它采用Pop 值并将其除以Density,以便在dfB 中得到一个新列area 并得到除法。 第一行结果示例 dfB['area km2'] = 100

我已尝试使用 np.where(),但它无法正常工作。关于如何实现这一点的任何提示?

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    使用索引匹配和div

    match_on = ['Country', 'City']
    dfA = dfA.set_index(match_on)
    dfA.assign(ratio=dfA.Pop.div(df.set_index(['Country', 'City'])['Density (pop/km2)']))
    

    Country  City      
    US       Washington    100.0
             Texas         100.0
    CH       Geneva        100.0
             Zurich        100.0
    dtype: float64
    

    【讨论】:

    • 酷!所以,对于你的两点。首先,您始终可以dropna 处理您不会使用的行。默认情况下,索引匹配执行类似右合并的操作,因此可能会弹出一些NaNs 是有意义的。第二,没问题。您可以存储和使用assign - 检查编辑
    • 这是一个不同的问题..您可能有重复的索引..您可以更新您的minimal reproducible example 以便我们重现您的(新)问题吗?
    • 不错!然后,从对您最有帮助的那两个中选择答案并接受它以供将来推荐;}
    【解决方案2】:

    您也可以使用merge 将两个数据框合并并照常划分:

    dfMerge = dfA.merge(dfB, on=['Country', 'City'])
    dfMerge['area'] = dfMerge['Pop'].div(dfMerge['Density (pop/km2)'])
    print(dfMerge)
    

    输出:

      Country        City   Pop  Density (pop/km2)   area
    0      US  Washington  1000                 10  100.0
    1      US       Texas  5000                 50  100.0
    2      CH      Geneva   500                  5  100.0
    3      CH      Zurich   500                  5  100.0
    

    【讨论】:

      【解决方案3】:

      你也可以像下面这样使用合并

      dfB["Area"] = dfB.merge(dfA, on=["Country", "City"], how="left")["Pop"] / dfB["Density (pop/km2)"]
      dfB
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-25
        • 1970-01-01
        • 2022-11-27
        • 2021-06-18
        • 2019-12-14
        • 1970-01-01
        • 2021-11-10
        • 2021-07-19
        相关资源
        最近更新 更多