有没有办法计算 pandas 中交叉表数据帧与另一个数据帧之间的比率?

Is there a way to calculate ratio between a crosstab dataframe with another dataframe in pandas?

摘要 - 最终目标是根据 Pandas 中交叉表函数的输出计算百分比,并在共享索引处使用另一个数据帧。

我试过的方法 - 尝试将原始交叉表数据框拆分为分子和 div 另一个数据框,但它似乎无法那样工作,因为结果都是 nan

代码

import pandas as pd
import numpy as np 

df1 = pd.DataFrame({"Vntg": ["2020-01","2020-02","2020-03"],"Funded":[1000,2000,4000]}) # This is the df we want to use as denominator
df2 = pd.DataFrame({"Vntg": ["2020-01","2020-01","2020-01","2020-02","2020-02","2020-03"],
                    "Funded":[1000,1000,1000,2000,2000,4000],
                    "Payment":[10,20,20,30,15,30],
                    "Timing":[0,1,2,0,1,0]})
ct_df = pd.crosstab(df2["Vntg"], df2["Timing"], values=df2["Payment"], aggfunc="sum", margins=False)
ct_df = ct_df.cumsum(axis=1) # This is the crosstab df we want to use as numerator on a cumulative basis

cumsum 开始累计支付,有没有办法 convert/replace 美元价值与 df1 中资助金额的百分比?在此先感谢并感谢所有帮助。

我也查看了下面的帖子,它似乎没有解决我的问题:

编辑:

所以我认为有些人对这个问题感到困惑。需要澄清的是,最终结果是在时间 0 从 df2 中取 10 除以资助金额,即 2020-01 年份的 df1 中的 1000。对于 1 的后续时间,它只是 df2 中的 (10+30) 并将相同的资助金额从 df1 中分配给相同的年份,因为它在本质上没有变化。结果将由其他年份的相同逻辑填充。

下面的方法不使用 crosstab,但应该给出相同的答案 (IIUC):

(
    df2.sort_values(["Vntg", "Timing"])
    .assign(cum_paymt=lambda df: df.groupby("Timing")["Payment"].transform("cumsum"))
    .assign(cum_share=lambda df: df["cum_paymt"] / df["Funded"])
    .pivot(index="Vntg", columns="Timing", values="cum_share")
)

如果以dataframe的形式给出预期的输出,对大家来说会更容易:

>>> ct_df.cumsum(axis=1).div(df1.set_index('Vntg')['Funded'], axis=0).mul(100)
Timing      0     1    2
Vntg                    
2020-01  1.00  3.00  5.0
2020-02  1.50  2.25  NaN
2020-03  0.75   NaN  NaN