我有一个包含6列的数据框。前5个唯一识别观察。第六是该观察的价值。我想转动数据,以便在5个标识列中,3成为分层行索引,而另外2成为分层列索引。
具体而言,通过以下设置:
import numpy as np
import pandas as pd
from itertools import product
np.random.seed(1)
team_names = ['Yankees', 'Mets', 'Dodgers']
jersey_numbers = [35, 71, 84]
game_numbers = [1, 2]
observer_names = ['Bill', 'John']
observation_types = ['Speed', 'Strength']
row_indices = list(product(team_names, jersey_numbers, game_numbers, observer_names, observation_types))
observation_values = np.random.randn(len(row_indices))
tns, jns, gns, ons, ots = zip(*row_indices)
data = pd.DataFrame({'team': tns, 'jersey': jns, 'game': gns, 'observer': ons, 'obstype': ots, 'value': observation_values})
我想重新整形数据,以便行team
,jersey
和game
,而列为observer
和obstype
。以下似乎完成了工作:
pd.pivot_table(data, values='value', cols=['observer', 'obstype'], rows=['team', 'jersey', 'game'])
有没有其他方法可以做这种事情?我最初尝试将除value
之外的所有列添加到索引中,然后使用unstack(['observer', 'obstype'])
。但这在我的列层次结构中给了我一个不必要的额外级别:一个未命名的级别,其唯一的条目是value
(即我的表格中我实际想要的数据列的名称)。
处理这种情况的正确方法是什么?是否只是像我上面那样使用pivot_table
?还是有更好的总体策略?
答案 0 :(得分:4)
我也认为两者都是好的和有价值的选择
在unstack
取消额外级别的情况下,您可以使用droplevel
:
>>> data = data.unstack(['observer', 'obstype'])
>>> data.columns = data.columns.droplevel(0)
>>> data
observer Bill John
obstype Speed Strength Speed Strength
game jersey team
1 35 Dodgers -0.110447 -0.617362 0.562761 0.240737
Mets -0.517094 -0.997027 0.248799 -0.296641
Yankees 0.520576 -1.144341 0.801861 0.046567
71 Dodgers 1.904659 1.111057 0.659050 -1.627438
Mets 2.190700 -1.896361 -0.646917 0.901487
Yankees 0.529465 0.137701 0.077821 0.618380
84 Dodgers -0.400878 0.824006 -0.562305 1.954878
Mets 1.331457 -0.287308 0.680070 -0.319802
Yankees 1.038825 2.186980 0.441364 -0.100155
2 35 Dodgers 0.280665 -0.073113 1.160339 0.369493
Mets 0.495211 -0.174703 0.986335 0.213534
Yankees -0.186570 -0.101746 0.868886 0.750412
71 Dodgers 0.602319 0.420282 0.810952 1.044442
Mets 2.528326 -0.248635 0.043669 -0.226314
Yankees 0.232495 0.682551 -0.310117 -2.434838
84 Dodgers -1.331952 -1.760689 -1.650721 -0.890556
Mets -1.272559 0.313548 0.503185 1.293226
Yankees -0.136445 -0.119054 0.017409 -1.122019
[18 rows x 4 columns]