多层次Pandas群

2024-10-01 00:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要保持“每个团队每个帐户的每个股票”的立场。所以我认为熊猫groupby可能会被使用。我也试图在dataframe的评论中说明我的问题。职位栏是我手工添加的。在

初始数据框

             time account scrip  buy_price  sell_price  qty   team  
0  06/07/17 09:36      A1  FUT1       50.0         NaN    2  team1         
1  06/07/17 09:46      A2  FUT1      100.0         NaN    2  team1         
2  06/07/17 09:56      A3  FUT1       10.0         NaN    2  team2         
3  06/07/17 09:57      A3  FUT1        NaN        10.0    2  team2         
4  06/07/17 09:58      A1  FUT1        NaN        50.0    1  team1         
5  06/07/17 09:59      A3  FUT1        NaN        50.0    1  team2 

我需要增加职位。position列是由我手动添加的,为了清楚地说明位置是如何计算的,我在注释中写了额外的注释。在

^{pr2}$

上面的例子只针对1个scrip FUT1,就会有很多个scrip。我的最终结果是类似的。在

Team Account Scrip Position
team1 A1      FUT1 1 
      A2      FUT1 2
team2 A3      FUT1 -1

一旦位置计算成功,可以在以后处理最终结果。 我的方法是:在每一行中创建一个唯一的键,以便知道何时应该+或-定位。例如,A1_FUT1_team1代表row1A2_FUT1_team1代表{}。然后加-减匹配键。这是个好方法吗?在


Tags: 方法a2a1职位代表帐户nan团队
2条回答

您的问题可以通过两个步骤轻松解决:

第一步:

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列替换为如下所示:

^{pr2}$

接下来,我使用这个新列创建您的position column,如下所示:

df['position'] = df.groupby(['team','account','scrip'])['some_stuff'].cumsum()

生成此列:

position
       2
       2
       2
       0
       1
      -1

奖金:

如果要删除多余的列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

pandas.Groupby

pandas.DataFrame.cumsum

pandas.DataFrame.min

这就是你要找的吗?在

df.groupby(['team', 'account', 'scrip']).min()

它给了我:

^{pr2}$

这比您想要的多了几列,但是您可以将所要查找的列子集化。在

(默认情况下,groupby会将分组的列移动到多级索引中,但如果您不希望这样做,您可以在.groupby()中添加{}作为参数)

相关问题 更多 >