python - Pandas - .pivot()

标签 python pandas pivot

假设我有以下数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame({"ort":["home","away","home","away"]*12, 
  "numbers":np.random.randint(0,3,48),"wins":np.random.randint(99,104,48)})

如何将 df 转换为 ort 成为列索引的形状,即生成的数据帧的形状如下所示

| Ort   | Home          |   Away        |
|-------|---------------|---------------|
| Index | numbers wins  |  numbers wins |
| 0     |  0 102        |  2 99         |
| 1     |  2 103        |  1 99         |

等等。

我尝试了df.pivot(columns = "ort"),但它不起作用,因为它导致主场和客场低于数字和胜利。

有人可以告诉我该怎么做吗?

我见过How to spread a column in a Pandas data frame 。然而,我的“数字”和“胜利”列只是占位符。在我的实际 df 中,我有 100 列(在上面的链接中只有一列)。所以我的问题是我该如何做到这一点。

谢谢!

最佳答案

您需要引入游戏id的占位符才能传播。

df['game_id'] = np.array(range(0, len(df.index)//2)).repeat(2)

然后这有效:

pd.pivot_table(df, index='game_id', columns='ort',values=['numbers','wins']
               ).swaplevel(0,1, axis=1).sort_index(axis=1)
#ort        away         home     
#        numbers wins numbers wins
#game_id                          
#0             2  101       2  101
#1             0  100       0   99
#2             1  101       2   99
#3             2  101       2  103
#4             0  103       1  101
#5             0   99       1  102
#...
#23            0  100       1  101

对您的评论进行跟进的一些解释:

  • 使用swaplevels(0,1, axis=1)交换multiIndex列的级别。

  • 使用 sort_index(axis=1) 按新的顶级索引(主场与客场)进行分组。

  • 如果您有一百个指标,则需要将 ['numbers','wins'] 替换为指标名称列表。

关于python - Pandas - .pivot(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46059876/

相关文章:

python - 重叠的极地计数器和散点图

python - Imbalanced-Learn 的 FunctionSampler 抛出 ValueError

python - 将缺失值附加到 CSV 文件

python - 将数据帧转换为热图矩阵?

.net - 适用于在 Mono/MySQL 上运行的 .NET 的免费 OLAP 解决方案

mysql - sql查询实现二合一

python - 寻找图书馆阅读 iPod 的数据库

python - Pandas - 根据两个单元格的相似内容合并行

python - 使用 pandas 查找重叠

MySQL Pivot 将记录转为列出所有数据的列