熊猫cumsum由独特的两列

问题描述 投票:0回答:1

我正在使用python,我希望根据结果表来收集两个团队的总目标,如下所示:

我把欲望输出放在colums(cumsumlocal和cumsumVisitor)中以便更好地解释,我想通过seasson和匹配注释每个团队的目标,有两个不同的seassons。所以对于每个海洋来说,cumsum必须是独一无二的。

   Seasson Match    Local   Visitor GoalLocal   goalVisitor _-->cumsumLocal cumsumVisitor
-----------------------------------------------------------------------------------------
    1       1   Machester   Blackburn   2      1    _---->    2       1
    1       1   Leeds       arsenal     2      4    _---->    2       4
    1       2   Blackburn   Leeds       1      3    _---->    3       5
    1       2   Arsenal     Manchester  2      0    _---->    6       2
    1       3   Leeds       Manchester  6      1    _---->    11      3
    1       3   Arsenal     Blackburn   5      0    _---->      
    2       1   Machester   Blackburn   3      1    _---->      
    2       1   Leeds       arsenal     2      0    _---->      
    2       2   Blackburn   Leeds       2      4    _---->      
    2       2   Arsenal     Manchester  1      3    _---->      
    2       3   Leeds       Manchester  2      0    _---->      
    2       3   Arsenal     Blackburn   6      1    _---->      
python pandas cumsum
1个回答
0
投票

我相信你需要 - 首先预处理将_添加到列名:

d = {'Local':'Team_Local','Visitor':'Team_Visitor',
     'GoalLocal':'Goal_Local','goalVisitor':'Goal_Visitor'}
df = df.rename(columns=d)
print (df)
    Seasson  Match  Team_Local Team_Visitor  Goal_Local  Goal_Visitor
0         1      1  Manchester    Blackburn           2             1
1         1      1       Leeds      Arsenal           2             4
2         1      2   Blackburn        Leeds           1             3
3         1      2     Arsenal   Manchester           2             0
4         1      3       Leeds   Manchester           6             1
5         1      3     Arsenal    Blackburn           5             0
6         2      1  Manchester    Blackburn           3             1
7         2      1       Leeds      Arsenal           2             0
8         2      2   Blackburn        Leeds           2             4
9         2      2     Arsenal   Manchester           1             3
10        2      3       Leeds   Manchester           2             0
11        2      3     Arsenal    Blackburn           6             1

MultiIndex创建split,然后由stack重塑并由groupby=+cumsum创建新专栏,最后由unstack重新塑造:

df = df.set_index(['Seasson','Match'], append=True)
df.columns = df.columns.str.split('_', expand=True)
df = df.stack()
#pandas 0.24+
df['Cum'] = df.groupby(['Seasson','Team'])['Goal'].cumsum()
#pandas lower
#df['Cum'] = df.reset_index().groupby(['Seasson','Team'])['Goal'].cumsum().values
df = df.unstack().reindex(['Team','Goal','Cum'], axis=1, level=0)
df.columns = df.columns.map('_'.join)
df = df.reset_index(level=0, drop=True).reset_index()

print (df)
    Seasson  Match  Team_Local Team_Visitor  Goal_Local  Goal_Visitor  \
0         1      1  Manchester    Blackburn           2             1   
1         1      1       Leeds      Arsenal           2             4   
2         1      2   Blackburn        Leeds           1             3   
3         1      2     Arsenal   Manchester           2             0   
4         1      3       Leeds   Manchester           6             1   
5         1      3     Arsenal    Blackburn           5             0   
6         2      1  Manchester    Blackburn           3             1   
7         2      1       Leeds      Arsenal           2             0   
8         2      2   Blackburn        Leeds           2             4   
9         2      2     Arsenal   Manchester           1             3   
10        2      3       Leeds   Manchester           2             0   
11        2      3     Arsenal    Blackburn           6             1   

    Cum_Local  Cum_Visitor  
0           2            1  
1           2            4  
2           2            5  
3           6            2  
4          11            3  
5          11            2  
6           3            1  
7           2            0  
8           3            6  
9           1            6  
10          8            6  
11          7            4  
© www.soinside.com 2019 - 2024. All rights reserved.