【问题标题】:Analysis on dataframe with python用python分析数据框
【发布时间】:2021-12-29 18:25:01
【问题描述】:

我希望能够计算每个射手姓名的平均“进球”、“射门”和“未命中”,以用于进一步分析和可视化

下面的代码为我提供了按“射手姓名”排序的“事件”列中 3 个属性(射门、进球、未命中)的计数

数据框列:

season  period  time    teamCode    event   goal    xCord   yCord   xCordAdjusted   yCordAdjusted   ... playerPositionThatDidEvent  timeSinceFaceoff    playerNumThatDidEvent   shooterPlayerId shooterName shooterLeftRight    shooterTimeOnIce    shooterTimeOnIceSinceFaceoff    shotDistance

对应数据

2020    1   16  PHI SHOT    0   -74 29  74  -29 ... C   16  11   8478439.0  Travis Konecny  R   16  16  32.649655
2020    1   34  PIT SHOT    0   49  -25 49  -25 ... C   34  9   8478542.0   Evan Rodrigues  R   34  34  47.169906
2020    1   65  PHI SHOT    0   -52 -31 52  31  ... L   65  86  8480797.0   Joel Farabee    L   31  31  48.270074
2020    1   171 PIT SHOT    0   43  39  43  39  ... C   42  9   8478542.0   Evan Rodrigues  R   42  42  60.307545   
2020    1   209 PHI MISS    0   -46 33  46  -33 ... D   38  5   8479026.0   Philippe Myers  R   38  38  54.203321

当前代码:

dft['count'] = df.groupby(['shooterName', 'event'])['event'].agg(['count'])
dft

电流输出:

shooterName event count
A.J. Greer  GOAL    1
            MISS    6
            SHOT    29
Aaron Downey    GOAL    1
                MISS    4
                SHOT    35

Zenon Konopka   GOAL    8
                MISS    57
                SHOT    176

              

期望的输出:

shooterName event count %totalshooterNameevents
A.J. Greer  GOAL    1   .0277
            MISS    6   .1666
            SHOT    29  .805

Aaron Downey    GOAL    1 .025
                MISS    4 .1
                SHOT    35 .875

Zenon Konopka   GOAL    8 .0331
                MISS    57 .236
                SHOT    176 .7302

类似的东西。我的最终目标是能够将每个“事件”属性计算为“射手名称”占总“事件”的百分比。下面我添加了一个列“%totalshooterNameevents”,它是“简单的目标”、“射门”和“未命中”,由每个“射手名称”的“目标、射门和未命中”之和计算得出

【问题讨论】:

  • 您能否提供数据框的前几行以检查它的外观?
  • 希望这样会更好

标签: python-3.x pandas dataframe numpy group-by


【解决方案1】:

更新

试试:

dft = df.groupby(['shooterName', 'event'])['event'].agg(['count']).reset_index()
dft['%total'] = dft.groupby('shooterName')['count'].apply(lambda x: x / sum(x))
print(dft)

# Output
     shooterName event  count    %total
0     A.J. Greer  GOAL      1  0.027778
1     A.J. Greer  MISS      6  0.166667
2     A.J. Greer  SHOT     29  0.805556
3   Aaron Downey  GOAL      1  0.025000
4   Aaron Downey  MISS      4  0.100000
5   Aaron Downey  SHOT     35  0.875000
6  Zenon Konopka  GOAL      8  0.033195
7  Zenon Konopka  MISS     57  0.236515
8  Zenon Konopka  SHOT    176  0.730290

没有样本,很难猜出你想要什么。试试:

import pandas as pd
import numpy as np

# Setup a Minimal Reproducible Example
np.random.seed(2021)
df = pd.DataFrame({'shooterName': np.random.choice(list('AB'), 20),
                   'event': np.random.choice(['shot', 'goal', 'miss'], 20)})

# Create an empty dataframe?
dft = pd.DataFrame(index=df['shooterName'].unique())

# Do stuff
grp = df.groupby('shooterName')
dft['count'] = grp.count()
dft = dft.join(grp['event'].value_counts().unstack('event')
                           .div(dft['count'], axis=0))

输出:

>>> dft
   count      goal   miss      shot
A     12  0.416667  0.250  0.333333
B      8  0.500000  0.375  0.125000

【讨论】:

  • 抱歉,我的知识有限,很难解释我想要什么,哈哈。我编辑了我的原始问题 - 添加了当前输出。我希望能够将“goal”、“miss”和“shot”计数相加,并为每个“shooterName”创建一个“total”属性
  • 尝试手动编辑您的结果,以便我更好地理解您想要什么。
  • 希望能给你一个想法
  • 谢谢,我又扩展了一点。如果您还有其他问题,请告诉我。感谢您的宝贵时间和帮助!
  • @jhh19。我更新了我的答案。我认为这是你所期望的。如果我是对的,请告诉我。
猜你喜欢
  • 2018-10-14
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多