为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着星空守着你 2023-02-15 16:02:47
我有以下 pd df 时间序列,其中有收盘价、确定何时开仓 (1) 或平仓 (-1) 的过滤器、仓位大小和总计(大小*收盘):Date        Close   Filter  O_Size  O_Tot1/5/2018    15.85   1       74      1172.91/8/2018    16.50   0       ... 2/14/2018   16.49   0       2/15/2018   16.03   -1      ...当Filter的值为-1时,我想新建一个列C_Tot = Close * O_Size,当size不为NaN时,取之前的值。Date        Close   Filter  O_Size  O_Tot    C_Tot1/5/2018    15.85   1       74      1172.91/8/2018    16.50   0       ... 2/14/2018   16.49   0       2/15/2018   16.03   -1                        1186.22...我想知道我是否可以在没有循环的情况下做到这一点。
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

我使用您在此处提供的有限数据创建了它。在使用它之前将所有空单元格设为 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


查看完整回答
反对 回复 2023-02-15
  • 1 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信