我有以下熊猫数据框:
\ndf = pd.DataFrame([[1,100, 200, float('nan')],\n [1, 110, float('nan'), float('nan')],\n [1, 115, float('nan'), float('nan')], \n [2, 50, 100, float('nan')], \n [2, 50, float('nan'), float('nan')], \n [3, 100, 100, float('nan')],\n [3, 125, float('nan'), float('nan')]],\n columns=['User', 'Amount', 'FAB', 'Result'])\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 User \xe2\x95\x91 Amount \xe2\x95\x91 FAB \xe2\x95\x91 Result \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1 \xe2\x95\x91 100 \xe2\x95\x91 200 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 110 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 115 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 100 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 100 \xe2\x95\x91 100 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 125 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\nRun Code Online (Sandbox Code Playgroud)\n我需要应用一些数学运算来填充 FAB 和结果:
\n例如,要填充结果列的第一行,我必须:
\ndf['Result'].iloc[0] = df['FAB'].iloc[0]*1.025 + df['Amount'].iloc[0]\nRun Code Online (Sandbox Code Playgroud)\n这等于 305,因此我们应该将该结果粘贴到结果的第一行和 FAB 的第二行
\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 User \xe2\x95\x91 Amount \xe2\x95\x91 FAB \xe2\x95\x91 Result \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1 \xe2\x95\x91 100 \xe2\x95\x91 200 \xe2\x95\x91 305 \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 110 \xe2\x95\x91 305 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 115 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 100 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 100 \xe2\x95\x91 100 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 125 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\nRun Code Online (Sandbox Code Playgroud)\n下一行的逻辑相同:
\ndf['Result'].iloc[1] = df['FAB'].iloc[1]*1.025 + df['Amount'].iloc[1]\nRun Code Online (Sandbox Code Playgroud)\n等于 422.62
\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 User \xe2\x95\x91 Amount \xe2\x95\x91 FAB \xe2\x95\x91 Result \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1 \xe2\x95\x91 100 \xe2\x95\x91 200 \xe2\x95\x91 305 \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 110 \xe2\x95\x91 305 \xe2\x95\x91 422.625 \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 115 \xe2\x95\x91 422.625 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 100 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 100 \xe2\x95\x91 100 \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 125 \xe2\x95\x91 NaN \xe2\x95\x91 NaN \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\nRun Code Online (Sandbox Code Playgroud)\n因此,在对所有用户应用相同的逻辑之后
\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 User \xe2\x95\x91 Amount \xe2\x95\x91 FAB \xe2\x95\x91 Result \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1 \xe2\x95\x91 100 \xe2\x95\x91 200 \xe2\x95\x91 305 \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 110 \xe2\x95\x91 305 \xe2\x95\x91 422.625 \xe2\x95\x91\n\xe2\x95\x91 1 \xe2\x95\x91 115 \xe2\x95\x91 422.625 \xe2\x95\x91 548.190625 \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 100 \xe2\x95\x91 152.5 \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 50 \xe2\x95\x91 152.5 \xe2\x95\x91 206.3125 \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 100 \xe2\x95\x91 100 \xe2\x95\x91 202.5 \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 125 \xe2\x95\x91 202.5 \xe2\x95\x91 332.5625 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\nRun Code Online (Sandbox Code Playgroud)\n有没有一种方法可以在不使用 for 循环的情况下实现这一目标?
\n下面列出了这里的逻辑,我认为 for 循环就是这样做的方法,因为这里的逻辑太多了......
\n\n\nRun Code Online (Sandbox Code Playgroud)\nC1 = B1*1.025 + A1\nC2 = C1*1.025 + A2 = (B1*1.025 + A1)*1.025 + A2\nC2 = (B1*1.025 + A1)*1.025*1.025 + A2*1.025 + A3\n
s=df.User.values\ns=np.tril((s==s[:,None]).cumsum(axis=1))\nidx=np.where(s==0)\ns=(s.max(1)[:,None]-s)\ns=1.025**s\ns[idx]=0\ng=df.groupby('User')\ns=s@df.Amount+1.025**(g.cumcount().add(1))*df.FAB.ffill()\ndf['New'] = s\nOut[173]: \n0 305.000000\n1 422.625000\n2 548.190625\n3 152.500000\n4 206.312500\n5 202.500000\n6 332.562500\ndtype: float64\nRun Code Online (Sandbox Code Playgroud)\n逐行解释
\n从C2 = (B1*1.025 + A1)*1.025*1.025 + A2*1.025 + A3我们知道该值等于为每个用户添加的两个等比数列。
s=df.User.values\ns=np.tril((s==s[:,None]).cumsum(axis=1))\ns\nOut[183]: \narray([[1, 0, 0, 0, 0, 0, 0],# row one only include A1 \n [1, 2, 0, 0, 0, 0, 0],# row two include A1 and A2 with different times of 1.025\n [1, 2, 3, 0, 0, 0, 0],\n [0, 0, 0, 1, 0, 0, 0],\n [0, 0, 0, 1, 2, 0, 0],\n [0, 0, 0, 0, 0, 1, 0],\n [0, 0, 0, 0, 0, 1, 2]], dtype=int32)\nRun Code Online (Sandbox Code Playgroud)\n从上面我们发现 Cn = B1 1.025**n + A1 1.025**n-1 + A2 1.025 n-2 + A3*n-3..
\n但是我们得到的 n 的系列是 1.....n ,所以我们需要将 1 反转为 n
\ns = (s.max(1)[:, None] - s)\ns\nOut[185]: \narray([[0, 1, 1, 1, 1, 1, 1],\n [1, 0, 2, 2, 2, 2, 2],\n [2, 1, 0, 3, 3, 3, 3],\n [1, 1, 1, 0, 1, 1, 1],\n [2, 2, 2, 1, 0, 2, 2],\n [1, 1, 1, 1, 1, 0, 1],\n [2, 2, 2, 2, 2, 1, 0]], dtype=int32)\nRun Code Online (Sandbox Code Playgroud)\n之后我们还需要将 0 位置保持为 0
\ns=1.025**s\ns[idx]=0\ns\nOut[187]: \narray([[1. , 0. , 0. , 0. , 0. , 0. ,\n 0. ],\n [1.025 , 1. , 0. , 0. , 0. , 0. ,\n 0. ],\n [1.050625, 1.025 , 1. , 0. , 0. , 0. ,\n 0. ],\n [0. , 0. , 0. , 1. , 0. , 0. ,\n 0. ],\n [0. , 0. , 0. , 1.025 , 1. , 0. ,\n 0. ],\n [0. , 0. , 0. , 0. , 0. , 1. ,\n 0. ],\n [0. , 0. , 0. , 0. , 0. , 1.025 ,\n 1. ]])\nRun Code Online (Sandbox Code Playgroud)\n然后我们就有了Power \xef\xbc\x8c的参数矩阵,然后我们只需要应用上面的计算
\n Cn = B1*1.025**n + A1*1.025**n-1 + A2*1.025*n-2 + A3*n-3..\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |