我有一個6列的數據框。前5個唯一標識一個觀察。第六是這個觀察的價值。我想旋轉數據,以便在5個標識列中,3個成爲分層行索引,而其他2個成爲分層列索引。重塑Pandas中的數據(多列索引,也可能在行中)
具體地,具有以下設置:
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
?還是有更好的一般策略?
兩種聲音的權利。除了長行很難閱讀([PEP 8](http://www.python.org/dev/peps/pep-0008/)):*限制所有行最多79個字符*) – dmvianna
如果我使用「創建一個巨大的索引,然後取消堆棧」方法,我該如何殺死列層次結構中的額外級別? – 8one6