假设我有以下数据框:

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"),该方法不起作用,因为它导致home and away低于数字并获胜。

有人可以给我一个提示怎么做吗?

我看过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/

10-12 17:02