pandas数据fram的条件滤波

2024-05-17 10:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于足球成绩的熊猫数据框。数据框的每一行代表一场足球赛。每场比赛的信息如下:

Day | WinningTeamID | LosingTeamID | WinningPoints | LosingPoints | WinningFouls | ... | 
1          13             1              45                5               3  
1          12             4              21                12              4              

也就是说,信息是根据游戏结果来划分的:胜负。 我想检索一个特定团队(如12)的每场比赛的数据。

Day | Points | Fouls | ... | 
1       21       4     ...
2       32       6     ...

最简单的方法是扫描整个数据帧,检查特定的teamID是否处于WinningID或LosingID状态,然后基于此检索“丢失列”或“赢得列”。 有没有更“优雅”的方式来切片熊猫数据框? 这只会给我12队参与的比赛的子集。

df[df[WinningTeamID == 12] | [LosingTeamID == 12]]

如何过滤这些数据并创建所需的数据帧?


Tags: 数据信息游戏df代表团队足球day
3条回答
df.query['WinningTeamID == 12 | LosingTeamID == 12']

假设我们可以选择数据的格式。什么是理想的?自从我们 想要收集每个TeamID的统计信息,理想情况下我们应该有一个TeamIDs列 并为每个统计数据(包括结果)单独列。

数据如下:

| Day | Outcome | TeamID | Points | Fouls |
|   1 | Winning |     13 |     45 |     3 |
|   1 | Losing  |      1 |      5 |   NaN |
|   1 | Winning |     12 |     21 |     4 |
|   1 | Losing  |      4 |     12 |   NaN |

下面是我们如何将给定的数据操作为所需的形式:

import numpy as np
import pandas as pd

df = pd.DataFrame({'Day': [1, 1], 'LosingPoints': [5, 12], 'LosingTeamID': [1, 4], 'WinningFouls': [3, 4], 'WinningPoints': [45, 21], 'WinningTeamID': [13, 12]})
df = df.set_index(['Day'])
columns = df.columns.to_series().str.extract(r'^(Losing|Winning)?(.*)', expand=True)
columns = pd.MultiIndex.from_arrays([columns[col] for col in columns], 
                                    names=['Outcome', None])
df.columns = columns
df = df.stack(level='Outcome').reset_index()
print(df)

收益率

   Day  Outcome  Fouls  Points  TeamID
0    1   Losing    NaN       5       1
1    1  Winning    3.0      45      13
2    1   Losing    NaN      12       4
3    1  Winning    4.0      21      12

现在我们可以使用

print(df.loc[df['TeamID']==12])
#    Day  Outcome  Fouls  Points  TeamID
# 3    1  Winning    4.0      21      12

^{}Day列移到索引中。

在索引中放置Day的目的是“保护”它不受操纵 (主要是stack调用)仅用于标记为LosingWinning的列。如果有其他列,如LocationOfficialsDay一样,不属于LosingWinning,那么 您还需要将它们包含在set_index调用中:例如df = df.set_index(['Day', 'Location', 'Officials'])

尝试从上面的代码中注释掉df = df.set_index(['Day'])。然后逐行遍历代码。 特别是,比较有和没有set_index调用时^{}的外观:

对于df = df.set_index(['Day'])

In [26]: df.stack(level='Outcome')
Out[26]: 
             Fouls  Points  TeamID
Day Outcome                       
1   Losing     NaN       5       1
    Winning    3.0      45      13
    Losing     NaN      12       4
    Winning    4.0      21      12

没有df = df.set_index(['Day'])

In [29]: df.stack(level='Outcome')
Out[29]: 
           Day  Fouls  Points  TeamID
  Outcome                            
0 NaN      1.0    3.0      45      13
  Losing   NaN    NaN       5       1
  Winning  1.0    3.0      45      13
1 NaN      1.0    4.0      21      12
  Losing   NaN    NaN      12       4
  Winning  1.0    4.0      21      12

如果没有set_index调用,您将得到不需要的行Outcome等于NaN的行。


目的

columns = df.columns.to_series().str.extract(r'^(Losing|Winning)?(.*)', expand=True)
columns = pd.MultiIndex.from_arrays([columns[col] for col in columns], 
                                    names=['Outcome', None])

是创建一个多级列索引(称为 MultiIndex)哪个 根据需要标记列LosingWinning。 注意,通过分离标签的LosingWinning部分, 标签的其余部分将被复制。

我们最终得到一个数据帧df,例如,有两列标记为“Points”。 这样熊猫就可以识别出这些列的相似之处。

最大的好处——我们之所以遇到设置多索引的麻烦,是为了通过调用^{}来“统一”这些“相似”列:

In [47]: df
Out[47]: 
Outcome Losing        Winning              
        Points TeamID   Fouls Points TeamID
Day                                        
1            5      1       3     45     13
1           12      4       4     21     12

In [48]: df.stack(level="Outcome")
Out[48]: 
             Fouls  Points  TeamID
Day Outcome                       
1   Losing     NaN       5       1
    Winning    3.0      45      13
    Losing     NaN      12       4
    Winning    4.0      21      12

stackunstackset_indexreset_index是4种基本的数据帧重塑操作。

  • ^{}将列索引的一个或多个级别移动到行索引中。
  • ^{}将行索引的一个或多个级别移动到列索引中。
  • ^{}将列值移到行索引中
  • ^{}将行索引的一个或多个级别移动到值列中

这4种方法一起允许您将数据帧中的数据移动到任何位置 想要——在列中,行索引或列索引。

上面的代码是如何使用这些工具的一个例子(好吧,四个中的三个) 将reshape data转换成所需的形式。

我觉得应该更像是:

df.query('columnX == 15 | columnY == 25')

相关问题 更多 >