Python 多层次分组
我需要保持“每个团队每个账户的每个临时票据”的状态。因此,我认为可以使用pandasPython 多层次分组,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
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,即使我对你想要达到的目标有点了解,在测试之前我也不能确定或者给你可能是错误的答案,所以创建另一个详细的问题,带有一些样本和所需的输出,并在这里传递链接,我会检查它。很抱歉给您带来不便