您的问题可以通过两步轻松解决:
第一步:
import math
df['some_stuff'] = df.apply(lambda x: -x.qty if math.isnan(x.buy_price) else x.qty,axis=1)
该行正在创建一个新列some_stuff
,为什么我这样做只是为了介绍一些逻辑gain and loss
在你的数据中。
如果您不想要新列并且您喜欢这个想法,只需替换qty
列如下:
df['qty'] = df.apply(lambda x: -x.qty if math.isnan(x.buy_price) else x.qty,axis=1)
接下来,我使用这个新列来创建您的position column
如下:
df['position'] = df.groupby(['team','account','scrip'])['some_stuff'].cumsum()
生成此列:
position
2
2
2
0
1
-1
bonus:
如果你想删除多余的列some_stuff
只需使用:
del df['some_stuff']
第二步:
这是您使用以下行获得最终分组表的步骤:
print(df.groupby(['team', 'account', 'scrip']).min())
最终输出:
time buy_price sell_price qty position
team account scrip
team1 A1 FUT1 06/07/17 09:36 50.0 50.0 1 1
A2 FUT1 06/07/17 09:46 100.0 NaN 2 2
team2 A3 FUT1 06/07/17 09:56 10.0 10.0 1 -1
我相信这可以回答您的问题。
文档:
pandas.DataFrame.apply https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html
pandas.Groupby https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html
pandas.DataFrame.cumsum https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.cumsum.html
pandas.DataFrame.min https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.min.html