我有一个包含6列的数据框 . 前5个唯一识别观察 . 第六是该观察的 Value . 我想转动数据,以便在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
?还是有更好的总体策略?
1 回答
我也认为两者都是好的和有 Value 的选择 .
并且在
unstack
的情况下摆脱额外的级别,你可以使用droplevel
: