获取熊猫数据框中列的先前非NaN值以进行计算

时间:2020-07-04 00:17:46

标签: python pandas dataframe

我有以下pd df时间序列,其中有收盘价,用于确定何时平仓(1)或平仓(-1),头寸大小以及总计(大小*平仓)的过滤器):

Date        Close   Filter  O_Size  O_Tot
1/5/2018    15.85   1       74      1172.9
1/8/2018    16.50   0       
... 
2/14/2018   16.49   0       
2/15/2018   16.03   -1      
...

当Filter的值为-1时,我想创建一个新列C_Tot = Close * O_Size,当它不是NaN时采用先前的size值。

Date        Close   Filter  O_Size  O_Tot    C_Tot
1/5/2018    15.85   1       74      1172.9
1/8/2018    16.50   0       
... 
2/14/2018   16.49   0       
2/15/2018   16.03   -1                        1186.22
...

我想知道我是否可以不进行循环操作。

欢呼

1 个答案:

答案 0 :(得分:0)

我使用您在此提供的有限数据创建了此文件。使用此文件之前,请将所有空单元格都放入nan。

import pandas as pd
import numpy as np

v=[["1/5/2018",15.85 ,  1,       74 ,     1172.9],
["1/8/2018",16.50 ,0       ,np.nan,np.nan],
["2/14/2018" , 16.49,   0  ,np.nan,np.nan]     ,
["2/15/2018",   16.03,   -1      ,np.nan,np.nan]]

df=pd.DataFrame(v,columns=["Date","Close","Filter","O_Size","O_Tot"])

tmp = df[df.Filter==-1]

def func(x):
    spl = df.iloc[:x.name,:]
    val = spl.iloc[spl["O_Size"].last_valid_index()].O_Size*x.Close
    return val

tmp["C_Tot"] = tmp.apply(func,axis=1)
res = pd.concat([df,tmp["C_Tot"]],axis=1)

输出

        Date  Close  Filter  O_Size   O_Tot    C_Tot
0   1/5/2018  15.85       1    74.0  1172.9      NaN
1   1/8/2018  16.50       0     NaN     NaN      NaN
2  2/14/2018  16.49       0     NaN     NaN      NaN
3  2/15/2018  16.03      -1     NaN     NaN  1186.22