如何让熊猫从下一行开始在新列中创建总和?



我正在尝试为各种场景创建金额累积总和的"幻灯片",并每次从下一行开始累积总和。

我正在尝试获得类似于以下内容的内容:

Start   Price   Amt.    1       2       3       4       5
4105    1.6     1234                    
4105    1.65    1183    3986.7              
4105    1.74    235     3963.2  4081.5          
4105    1.5     1848    3778.4  3896.7  3920.2      
4105    1.45    3183    3460.1  3578.4  3601.9  3786.7  
4105    1.47    7295    2730.6  2848.9  2872.4  3057.2  3375.5
4105    1.31    4384    2292.2  2410.5  2434    2618.8  2937.1
4105    1.41    734     2218.8  2337.1  2360.6  2545.4  2863.7
4105    1.4     2773    1941.5  2059.8  2083.3  2268.1  2586.4
4105    1.4     4429    1498.6  1616.9  1640.4  1825.2  2143.5
4105    1.4     396     1459    1577.3  1600.8  1785.6  2103.9
4105    1.38    461     1412.9  1531.2  1554.7  1739.5  2057.8
4105    1.38    186     1394.3  1512.6  1536.1  1720.9  2039.2
4105    1.38    368     1357.5  1475.8  1499.3  1684.1  2002.4
4105    1.47    362     1321.3  1439.6  1463.1  1647.9  1966.2
4105    1.43    601     1261.2  1379.5  1403    1587.8  1906.1
4105    1.4292  307     1230.5  1348.8  1372.3  1557.1  1875.4
4105    1.368   132     1217.3  1335.6  1359.1  1543.9  1862.2
4105    1.31    1891    1028.2  1146.5  1170    1354.8  1673.1
4105    1.31    335     994.7   1113    1136.5  1321.3  1639.6
4105    1.34    265     968.2   1086.5  1110    1294.8  1613.1
4105    1.22    701     898.1   1016.4  1039.9  1224.7  1543
4105    1.2     832     814.9   933.2   956.7   1141.5  1459.8
4105    1.17    2759    539     657.3   680.8   865.6   1183.9
4105    1.1799  7       538.3   656.6   680.1   864.9   1183.2
4105    1.2     2       538.1   656.4   679.9   864.7   1183
4105    1.19    100     528.1   646.4   669.9   854.7   1173
4105    1.08    2561    272     390.3   413.8   598.6   916.9
4105    1.1     3063    0       84      107.5   292.3   610.6
4105    1.05    660             18      41.5    226.3   544.6
4105    1.11    947             0       0       131.6   449.9
4105    1.3     4381                            0       11.8
4105    1       103                                     1.5
4105    1.0799  1                                       1.4
4105    1.0068  124                                     0

"开始"、"价格"和"Amt"值位于数据帧中。第一个值 (3986.7( 是当天 Amt 的 10% (118.3(,从起始值(常量(中减去。下一个值是从 4105 中减去第一个金额的 10% 加上第二个金额 (118.3+23.5( 的总和。在第二列中,我们从相同的 4105 开始,但从减去 23.5 开始,依此类推。每个"幻灯片"的行应为空,或 NaN。

下面的代码让我接近(末尾的两行将负数替换为 0(:

import pandas as pd
df = pd.read_csv("datafile.csv")
length = len(df)
begPos = df.Position
df['sub_value'] = df.Volume*.1
for x in range(10):
df['slide_' +str(x)] = begPos.shift(1-x) - df.sub_value.shift(-x).cumsum()

numb = df._get_numeric_data()
numb[numb < 0] = 0

这将为我提供正确的值,但将它们全部从第一行开始。

我尝试过使用移位值(对于每个组合,我在每个排列 x、-x、x-1、X+1 等上都有一个完整的矩阵(,但无法让它工作。

在我解决这个问题之后,这个程序还有一些部分,但我希望这些部分在比较中会很容易。

为 10% 的值创建一个列,然后在循环中将其与 cumsum(( 一起使用。 最后,您可以将 NaN 替换为 ",并删除不需要的列。

df["10pcnt"]=df["Amt."].div(10)
Start   Price  Amt.  10pcnt
0    4105  1.6000  1234   123.4
1    4105  1.6500  1183   118.3
2    4105  1.7400   235    23.5
3    4105  1.5000  1848   184.8
4    4105  1.4500  3183   318.3
5    4105  1.4700  7295   729.5
6    4105  1.3100  4384   438.4
7    4105  1.4100   734    73.4
8    4105  1.4000  2773   277.3
9    4105  1.4000  4429   442.9
10   4105  1.4000   396    39.6
11   4105  1.3800   461    46.1
...
for i in range(1,len(df)): 
df[i]= df.Start.sub(df.loc[i:,"10pcnt"].cumsum()) 
df[i]= df[i].where(df[i]>=0,np.nan) 

Start   Price  Amt.  10pcnt       1       2       3  ...
0    4105  1.6000  1234   123.4     NaN     NaN     NaN  ...
1    4105  1.6500  1183   118.3  3986.7     NaN     NaN  ...
2    4105  1.7400   235    23.5  3963.2  4081.5     NaN  ...
3    4105  1.5000  1848   184.8  3778.4  3896.7  3920.2  ...
4    4105  1.4500  3183   318.3  3460.1  3578.4  3601.9  ...
5    4105  1.4700  7295   729.5  2730.6  2848.9  2872.4  ...
6    4105  1.3100  4384   438.4  2292.2  2410.5  2434.0  ...
7    4105  1.4100   734    73.4  2218.8  2337.1  2360.6  ...
8    4105  1.4000  2773   277.3  1941.5  2059.8  2083.3  ...
9    4105  1.4000  4429   442.9  1498.6  1616.9  1640.4  ...
10   4105  1.4000   396    39.6  1459.0  1577.3  1600.8  ...
11   4105  1.3800   461    46.1  1412.9  1531.2  1554.7
df.drop(columns="10pcnt")
df.replace(np.nan,"")

最新更新