假设我有以下数据框:
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/