【问题标题】:How can I match the two dataframe and get the following result?如何匹配两个数据框并获得以下结果?
【发布时间】:2020-02-20 03:29:42
【问题描述】:

我有以下数据框: payment 是带值的支付行名称

payment = pd.DataFrame({'Payment':["payment1","payment2","payment3"],'Value':[100,200,300]})

Payment     Value
payment1    100
payment2    200
payment3    300

project_cost 是项目名称及其成本的行

project_cost = pd.DataFrame({'Project':["Project1","Project2","Project3"],'Cost':[200,300,400]})

Project        Cost
Project1       200
Project2       300
Project3       400

我基本上想把付款和项目匹配。

如何获取以下数据框?

Project     Cost      Payment 
Project1     100      payment1
Project1     100      payment2
Project2     100      payment2
Project2     200      payment3
Project3     100      payment3
Project3     300    

最后一行付款留空,因为支付项目的款项存在赤字。

我可以在 pandas 中做些什么来获得这个结果吗? 非常感谢

以下是我的数据框的逻辑:

根据项目对付款进行细分。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我不确定我是否正确理解了这个问题,但是如果您想合并两个数据框,那么您需要至少有一列来匹配,即“价值”或“成本”。因此,如果您有以下输入

    payment = pd.DataFrame({'Payment':["payment1","payment2","payment3"],'Cost':[100,200,300]})
    project_cost = pd.DataFrame({'Project':["Project1","Project2","Project3"],'Cost':[200,300,400]})
    

    然后就可以在pandas中使用merge合并两个数据框了

    result = pd.merge(payment, project_cost, on= 'Cost')
    

    如果我对问题的理解正确,请告诉我。

    编辑:

        Payment Cost    Project
    0   payment1    200 Project1
    1   payment2    200 Project1
    2   payment3    200 Project1
    

    这是你要找的吗?

    【讨论】:

    • 这是一种合并数据框,但里面有一些额外的逻辑。我想合并项目和付款数据框,但付款应先与项目匹配。
    • 我添加了一张图片来帮助你理解我背后的逻辑。
    【解决方案2】:

    以下似乎适用于示例数据。你应该再检查一下。这个想法是您计算成本和付款的累积 (cumsum)。然后您可以对它们进行越来越多的排序,并尝试相应地传播PaymentProject

    project_cost['accum'] = project_cost['Cost'].cumsum()
    payment['accum'] = payment['Value'].cumsum()
    
    (payment.merge(project_cost, on='accum', how='outer')
        .sort_values('accum')
        .bfill()
    )
    

    输出:

        Payment  Value  accum   Project   Cost
    0  payment1  100.0    100  Project1  200.0
    3  payment2  200.0    200  Project1  200.0
    1  payment2  200.0    300  Project2  300.0
    4  payment3  300.0    500  Project2  300.0
    2  payment3  300.0    600  Project3  400.0
    5       NaN    NaN    900  Project3  400.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 2013-04-18
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多