【问题标题】:How to generate continuous record from incomplete data in Pandas Dataframe如何从 Pandas Dataframe 中的不完整数据生成连续记录
【发布时间】:2014-02-25 21:11:24
【问题描述】:

好的,我有一个关于游戏结果的数据集不完整,我想为该游戏中没有数据的玩家生成一个包含现有数据或零值的图。此外,我想通过列表添加数据:有些玩家是攻击者,有些是防御者 我的数据是这样的:

原始数据

Game    Player  Goal    Assits  Fouls
1   Alpha       1       1       0
1   Beta        2       0       1
2   Alpha       0       1       1
2   Gamma       2       0       0
3   Beta        3       0       1
4   Alpha       1       1       1
4   Beta        2       0       1
5   Alpha       0       1       1
5   Beta        1       0       0
5   Gamma       0       1       1

目标得分 + 助攻得分和进攻得分 = ['Alpha','Beta'] 和后卫 =['Gamma']

Game    Attackers   Defenders
1       4           0
2       1           2
3       3           0
4       4           0
5       2           1

我在 pandas 数据框中拥有所有原始数据,并且我尝试使用 isin 函数来获取数据。这给我留下了不同长度的结果,即如果它“不在”中,则没有添加数据。我会(如图所示,就像零一样。 ==> 即在第 1 场比赛中没有提到 Gamma,所以他得零分。

感谢您的帮助

【问题讨论】:

    标签: python python-3.x pandas dataframe missing-data


    【解决方案1】:

    这有点乱,但肯定是可行的。

    首先,您需要在df 上添加reset_index(),以便更轻松地进行分组。 Groupby 不会优雅地同时处理索引列上的分组 (GH issue)。

    In [64]: df = df.reset_index()
    

    定义从球员到位置(进攻方或防守方)的映射:

    In [65]: kind = {'Alpha': 'Attackers', 'Beta': 'Attackers', 'Gamma': 'Defenders'}
    

    理想情况下,您可以在一行中完成接下来的 3 个步骤,但我在聚合时遇到了问题。首先按位置和比赛进行分组。

    In [66]: grouped = df.groupby(['Game', df.Player.map(kind)]).sum()
    
    In [67]: grouped
    Out[67]: 
                    Goal  Assits  Fouls
    Game Player                        
    1    Attackers     3       1      1
    2    Attackers     0       1      1
         Defenders     2       0      0
    3    Attackers     3       0      1
    4    Attackers     3       1      2
    5    Attackers     1       1      1
         Defenders     0       1      1
    
    [7 rows x 3 columns]
    

    然后计算点数,得到Series

    In [68]: points = grouped['Goal'] + grouped['Assits']
    
    In [69]: points
    Out[69]: 
    Game  Player   
    1     Attackers    4
    2     Attackers    1
          Defenders    2
    3     Attackers    3
    4     Attackers    4
    5     Attackers    2
          Defenders    1
    dtype: int64
    

    终于unstack()。这会在没有任何值的情况下创建 NaN(例如第 1 场比赛,Defenders),我们将用 0 填充。

    In [70]: points.unstack('Player').fillna(0)
    Out[70]: 
    Player  Attackers  Defenders
    Game                        
    1               4          0
    2               1          2
    3               3          0
    4               4          0
    5               2          1
    
    [5 rows x 2 columns]
    

    【讨论】:

    • 您好快速跟进问题:是否可以映射到字典列表中的项目,即:` kind = {'Alpha': ['Attackers',1976], 'Beta': ['Attackers',1980], 'Gamma': ['Defenders',1977]} grouped = df.groupby(['Game', df.Player.map(kind**[0]**)]).sum() 这似乎不起作用,我不确定它是否这是不可能的,我总是可以从主词典中生成单独的词典,以避免在多个位置更新数据,谢谢
    • 最好将它们创建为数据框中的单独列。然后你可以做df.groupby(['Game', 'kind', 'year']).sum() 或类似的事情。
    • 感谢@TomAugspurger,但我的问题不是在数据框中有一个列表,而是让映射工作,即当我映射到说'Gamma':['Defenders', 1977] 时我不知道如何只需将列表项 [0] 放入该字段:df.Player.map(kind[0]) 似乎不起作用 ----- 谢谢
    猜你喜欢
    • 2021-04-01
    • 2017-04-10
    • 1970-01-01
    • 2018-02-07
    • 2019-07-12
    • 2021-05-27
    • 2018-02-22
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多