我有以下熊猫数据框:
\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\n我需要应用一些数学运算来填充 FAB 和结果:
\n例如,要填充结果列的第一行,我必须:
\ndf['Result'].iloc[0] = df['FAB'].iloc[0]*1.025 + df['Amount'].iloc[0]\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\n下一行的逻辑相同:
\ndf['Result'].iloc[1] = df['FAB'].iloc[1]*1.025 + df['Amount'].iloc[1]\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\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\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\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)\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)\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.      ]])\n然后我们就有了Power \xef\xbc\x8c的参数矩阵,然后我们只需要应用上面的计算
\n Cn = B1*1.025**n + A1*1.025**n-1 + A2*1.025*n-2 + A3*n-3..\n| 归档时间: | 
 | 
| 查看次数: | 421 次 | 
| 最近记录: |