熊猫-如何根据条件求和2列中的X个最后一个值

stahoooo

最近,我开始学习熊猫。我确实试图获得解决方案,但找不到它。这是问题。

我有一个数据框:简单的足球数据。对于每支球队,我想知道他们在前两场比赛中打进了多少个进球;无论他们是主队还是客队。因此,我必须为每个团队从2个不同的列中汇总特定数量的值。

样本数据:

import pandas as pd
data = [['2018-02-03', 'manutd', 'chelsea', 3, 1], ['2018-02-08', 'arsenal', 'liverpool', 1, 1], 
        ['2018-01-12', 'chelsea', 'westham', 2, 0], ['2018-01-12', 'liverpool', 'manutd', 0, 2], 
        ['2018-03-15', 'arsenal', 'chelsea', 2, 2], ['2018-02-20', 'manutd', 'brighton', 0, 0], 
        ['2018-04-01', 'westham', 'fulham', 1, 0], ['2018-03-15', 'manutd', 'westham', 2, 1]] 
df = pd.DataFrame(data, columns = ['event_time', 'home_team', 'away_team', 'home_goals', 'away_goals'])
df['event_time'] = pd.to_datetime(df['event_time'])
df.sort_values(['event_time'],inplace=True, ascending=False)
print(df)


  event_date  home_team  away_team  home_goals  away_goals
6 2018-04-01    westham     fulham           1           0
4 2018-03-15    arsenal    chelsea           2           2
7 2018-03-15     manutd    westham           2           1
5 2018-02-20     manutd   brighton           0           0
1 2018-02-08    arsenal  liverpool           1           1
0 2018-02-03     manutd    chelsea           3           1
2 2018-01-12    chelsea    westham           2           0
3 2018-01-12  liverpool     manutd           0           2

我要实现的目标:

  event_time  home_team  away_team  home_goals  away_goals  h_goals_previous_2  a_goals_previous_2
6 2018-04-01    westham     fulham           1           0                  1                  NaN
4 2018-03-15    arsenal    chelsea           2           2                  1                    3
7 2018-03-15     manutd    westham           2           1                  3                    0
5 2018-02-20     manutd   brighton           0           0                  5                  NaN
1 2018-02-08    arsenal  liverpool           1           1                NaN                    0
0 2018-02-03     manutd    chelsea           3           1                  2                      2
2 2018-01-12    chelsea    westham           2           0                NaN                  NaN
3 2018-01-12  liverpool     manutd           0           2                NaN                  NaN

描述:-在2018-03-15阿森纳与切尔西队在一起。在之前的2场比赛中,切尔西总共进球3个进球:1个在客队时,2个在主队时。-之前的一些目标是Nan,因为我们没有以前比赛的数据。

我试图通过逐个团队地迭代来做到这一点,对于每个团队,我都在构建df的排序子集,然后可以汇总这些值,但是觉得它不是最佳解决方案,可以使用漂亮的Pandas表达式来完成:

teams = pd.unique(df[['home_team', 'away_team']].values.ravel('K'))
for team in teams:
    print(team)
    team_df = df[(df['home_team']==team) | (df['away_team']==team)]
    team_df.sort_values(['event_date'],inplace=True, ascending=False)
    print(team_df)

如何在不编写循环和if的情况下做到这一点?

安塞夫

方法1 pd.wide_to_long

#Create a df2 with index like a column a rename the columns to apply:
# pd.wide_to_long

df2=df.set_index('event_time',append=True)
df2.columns=[''.join(name[::-1]) for name in  df2.columns.str.split('_')]
df2.columns=df2.columns.str.replace('home','1').str.replace('away','2')
df2=df2.reset_index()

#Using pd.wide_to_long
df_long=( pd.wide_to_long(df2,['team','goals'],i='level_0',j='key')
          .sort_values('event_time',ascending=False) )
print(df_long)


            event_time       team  goals
level_0 key                             
6       1   2018-04-01    westham      1
        2   2018-04-01     fulham      0
4       1   2018-03-15    arsenal      2
7       1   2018-03-15     manutd      2
4       2   2018-03-15    chelsea      2
7       2   2018-03-15    westham      1
5       1   2018-02-20     manutd      0
        2   2018-02-20   brighton      0
1       1   2018-02-08    arsenal      1
        2   2018-02-08  liverpool      1
0       1   2018-02-03     manutd      3
        2   2018-02-03    chelsea      1
2       1   2018-01-12    chelsea      2
3       1   2018-01-12  liverpool      0
2       2   2018-01-12    westham      0
3       2   2018-01-12     manutd      2

#calculating the sum
groups_goals=df_long.groupby('team')['goals']
df_long=df_long.assign(value_2_sum=groups_goals.shift(-1)+groups_goals.shift(-2))

#Getting goals previous columns
goals_previous=df_long.pivot_table(index='level_0',columns='key',values='value_2_sum',dropna=False)

df[['h_goals_previous_2',  'a_goals_previous_2']]=goals_previous
print(df)

方法2: DataFrame.melt

cols=['h_goals_previous_2',  'a_goals_previous_2']
df2=( df.reset_index()
        .melt(['event_time','home_team','away_team','index'])
        .sort_values('event_time',ascending=False) )
df2['team']=df2['home_team'].mask(df2['variable'].eq('away_goals'),df2['away_team'])

groups_goals=df2.groupby('team')['value']

df2['value_2']=groups_goals.shift(-2)+groups_goals.shift(-1)
df[cols]=( df2.pivot_table(columns='variable',index='index',values='value_2',dropna=False)
              .sort_index(axis=1,ascending=False) )
print(df)

输出:

  event_time  home_team  away_team  home_goals  away_goals  \
6 2018-04-01    westham     fulham           1           0   
4 2018-03-15    arsenal    chelsea           2           2   
7 2018-03-15     manutd    westham           2           1   
5 2018-02-20     manutd   brighton           0           0   
1 2018-02-08    arsenal  liverpool           1           1   
0 2018-02-03     manutd    chelsea           3           1   
2 2018-01-12    chelsea    westham           2           0   
3 2018-01-12  liverpool     manutd           0           2   

   h_goals_previous_2  a_goals_previous_2  
6                 1.0                 NaN  
4                 NaN                 3.0  
7                 3.0                 NaN  
5                 5.0                 NaN  
1                 NaN                 NaN  
0                 NaN                 NaN  
2                 NaN                 NaN  
3                 NaN                 NaN  

请注意还有更多的NaN值,因为我只使用了数据框中显示的行

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫如何根据最后一个元素的条件保留值或更改列的值

根据熊猫数据框中另一列的最后一个值填充列

根据熊猫中的条件创建一个布尔列

根据熊猫中的第一个和最后一个逗号分隔列

如何获取熊猫中每列的最后一个非空值?

熊猫-根据另一个列表中的索引求和列表中的值

熊猫从组中获取列的第一个和最后一个值

通过对列中的前一个值求和并乘以在熊猫中创建一列

获取值是系列中的最后一个值以匹配熊猫中的某些条件

如果满足条件,则根据上一个非零值在“熊猫”列中填充零值

根据另一个值熊猫更新列

熊猫,根据数据间隔创建一个列值

熊猫数据框找到低于组内列中特定值的最后一个值

如何根据第二列的值设置一个熊猫数据框列值

如何对熊猫数据框中的所有数值求和以得出一个值

根据另一个(熊猫)中的值增加列中的值

熊猫:如何根据其他列值的条件求和?

根据熊猫中的另一个列值突出显示一个列值

如何根据来自另一个表的检查替换熊猫数据框中的一列中的值

如何用熊猫在另外两个列中的唯一值上求和?

根据熊猫中的另一个列值更改列值

根据一列中的条件创建一个新的熊猫列,并从同一数据框中的多列中分配值

熊猫根据另一列中的前10个值在一个列中分配值

根据熊猫中的另一个数据框更改列中的值

如何根据熊猫中的条件对某些列进行求和

根据另一个熊猫中开始日期和结束日期列的条件创建新的熊猫数据框

如何根据熊猫中的另一个更改数据框中的值?

熊猫:按两列分组,对第一列分组中的第一个值求和

在熊猫中,根据顺序和值创建一个新列