我有一个关于足球结果的熊猫数据框。数据框的每一行代表一场足球比赛。每场比赛信息如下:
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 上,然后基于此检索“ Losing-columns ”或“ Winning-columns ”。是否有更“优雅”的切片熊猫数据框的方式?这只会给我第 12 队参与的比赛子集。
df[df[WinningTeamID == 12] | [LosingTeamID == 12]]
如何过滤这些数据并创建所需的数据框?
原文由 NCL 发布,翻译遵循 CC BY-SA 4.0 许可协议
假设我们可以选择数据的格式。什么是理想的?因为我们想收集每个
TeamID
的统计数据,理想情况下我们会有一列TeamID
s 和每个统计数据的单独列,包括结果。所以数据看起来像这样:
以下是我们如何将给定数据操作成所需的形式:
产量
现在我们可以获得关于
TeamID
12 的所有统计信息使用df = df.set_index(['Day'])
将Day
列移动到索引中。将
Day
放在索引中的目的是“保护”它免受操作(主要是stack
调用),这些操作仅用于标记为Losing
Winning
3 的列---
。 If you had other columns, such asLocation
orOfficials
which, likeDay
, do not pertain toLosing
orWinning
,然后您还想将它们包含在set_index
调用中:例如df = df.set_index(['Day', 'Location', 'Officials'])
。尝试从上面的代码中注释掉
df = df.set_index(['Day'])
。然后逐行执行代码。特别是,比较df.stack(level='Outcome')
有和没有set_index
调用时的样子:随着
df = df.set_index(['Day'])
:没有
df = df.set_index(['Day'])
:如果没有
set_index
调用,您最终会得到不需要的行Outcome
等于NaN
的行。的目的
是创建一个多级列索引(称为 MultiIndex ),它根据需要标记列
Losing
或Winning
。请注意,通过分离标签的Losing
或Winning
部分,标签的其余部分将重复。我们最终得到一个 DataFrame,
df
,例如,有两列标记为“Points”。这允许 Pandas 将这些列识别为某种相似的列。最大的收获——我们经历设置 MultiIndex 的麻烦的原因是这些“相似”的列可以通过调用
df.stack
来“统一”:stack
,unstack
,set_index
andreset_index
are the 4 fundamental DataFrame reshaping operations.df.stack
将列索引的一个(或多个)级别移动到行索引中。df.unstack
将行索引的一个(或多个)级别移动到列索引中。df.set_index
将列值移动到行索引中df.reset_index
将行索引的一个(或多个)级别移动到值的列中结合使用这 4 种方法,您可以将 DataFrame 中的数据移动到您想要的任何位置——在列、行索引或列索引中。
上面的代码是如何使用这些工具(嗯,四个中的三个)将 数据重塑 为所需形式的示例。