Python 多层次分组

Python 多层次分组,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我需要保持“每个团队每个账户的每个临时票据”的状态。因此,我认为可以使用pandasgroupby。我也试图在dataframe的评论中陈述我的问题。职位栏已由我手动添加 我的初始df 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

我需要保持“每个团队每个账户的每个临时票据”的状态。因此,我认为可以使用pandas
groupby
。我也试图在dataframe的评论中陈述我的问题。职位栏已由我手动添加

我的初始df

             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 
我需要增加职位。职位栏是我手动添加的,为了清楚说明职位是如何计算的,我在评论中写了额外的备注

             time account scrip  buy_price  sell_price  qty   team  position                                    comment
0  06/07/17 09:36      A1  FUT1       50.0         NaN    2  team1         2  this can only be sold by team1 account A1
1  06/07/17 09:46      A2  FUT1      100.0         NaN    2  team1         2  this can only be sold by team1 account A2
2  06/07/17 09:56      A3  FUT1       10.0         NaN    2  team2         2  this can only be sold by team2 account A3
3  06/07/17 09:57      A3  FUT1        NaN        10.0    2  team2         0                 sold by team 2 in  acc A3 
4  06/07/17 09:58      A1  FUT1        NaN        50.0    1  team1         1                  sold by team 1 in acc A1 
5  06/07/17 09:59      A3  FUT1        NaN        50.0    1  team2        -1                   sold by team 2 in acc A3
上面的例子只针对一张纸条FUT1,会有很多纸条。我的最终结果将类似于

Team Account Scrip Position
team1 A1      FUT1 1 
      A2      FUT1 2
team2 A3      FUT1 -1
一旦位置计算成功,最终结果可以在以后处理。
我的方法是:在每一行中创建一个唯一的键,以便知道何时使用+或-位置。例如,
A1\u FUT1\u team1
用于
row1
A2\u FUT1\u team1
用于
row2
。然后加上减去匹配的关键点。不管怎样,这是一个好方法吗?

这就是你想要的吗

df.groupby(['team', 'account', 'scrip']).min()
它给了我:

                      time  buy_price  sell_price  qty  position
team  account scrip                                             
team1 A1      FUT1   09:36       50.0        50.0    1         1
      A2      FUT1   09:46      100.0         NaN    2         2
team2 A3      FUT1   09:56       10.0        10.0    1        -1
这比您想要的多几列,但您可以将要查找的内容子集


(groupby默认情况下将分组列移动到多级索引,但如果这不是您想要的,您可以在
.groupby()
中添加
作为\u index=False
作为参数)

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

第一步:

import math
df['some_stuff'] = df.apply(lambda x: -x.qty if math.isnan(x.buy_price) else x.qty,axis=1)
这一行正在创建一个新的列
some_stuff
,我之所以这样做只是为了在您的数据中引入一些
增益和损耗的逻辑

如果您不想要一个新的列,并且您喜欢这个想法,只需将
qty
列替换为以下内容:

df['qty'] = df.apply(lambda x: -x.qty if math.isnan(x.buy_price) else x.qty,axis=1)
接下来,我使用这个新列创建您的
位置列
,如下所示:

df['position'] = df.groupby(['team','account','scrip'])['some_stuff'].cumsum()
这将生成此列:

position
       2
       2
       2
       0
       1
      -1
奖金:

如果要删除额外的列
某些内容
,只需使用:

del df['some_stuff']
第二步:

import math
df['some_stuff'] = df.apply(lambda x: -x.qty if math.isnan(x.buy_price) else x.qty,axis=1)
这是使用此行获取最终分组表的步骤:

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
我相信这回答了你的问题

文档:

import math
df['some_stuff'] = df.apply(lambda x: -x.qty if math.isnan(x.buy_price) else x.qty,axis=1)


你能展示一下你真正尝试过的吗?怎么做?行1:pos=+2因为t1a1购买了2个数量,行2:pos=+2因为t1a2购买了2个数量,行3:pos:+2因为t2a3购买了2个数量,行4:pos=0因为t23出售了2个数量,依此类推。你觉得怎么了。?t1a1=>team1account1oh现在我看到了,注释栏不够清晰,尽管我首先需要添加位置栏。正确添加后,您的解决方案就可以了。但主要的问题是如何获得职位栏。哦!我不确定我是否理解你是如何计算位置的。职位是一个等级吗?一个销售点?没有一个仓位像是你买了n个数量,你就去+n个仓位(对于该团队,该账户为该票据),如果你卖了n个数量,你就去-n个仓位。买2,然后卖1,使你的位置1。阅读第二个df中的注释可能会有帮助谢谢你的帮助,我正在尝试将这部分嵌入到我的代码中。我认为
df['position']=df.groupby(['team','account'])['some_stuff'].cumsum()
应该是
df['position']=df.groupby(['team','account','scrip'])['some_stuff'].cumsum()
,因为我需要每个人的职位scrip@pythonRcpp关于这一点,我不知道你的其他数据,因为在你的评论栏中没有提到scrip,我只是做了一些适合提供样本的事情,但是是的,对于整个事情,我认为你应该按照团队、账户和scrip进行分组。我也会在答案中加上,嘿,有没有办法得到每组的最后一行?在做了
df['position']=df.groupby(['team','account','scrip'])['some_stuff'].cumsum()之后,
。(所以我对每个小组都有最终的立场)。@pythonRcpp,即使我对你想要达到的目标有点了解,在测试之前我也不能确定或者给你可能是错误的答案,所以创建另一个详细的问题,带有一些样本和所需的输出,并在这里传递链接,我会检查它。很抱歉给您带来不便