首页 文章

重塑Pandas中的数据(列中的多索引,也可能在行中)

提问于
浏览
3

我有一个包含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})

我想重塑数据,以便行是 teamjerseygame ,而列是 observerobstype . 以下似乎完成了工作:

pd.pivot_table(data, values='value', cols=['observer', 'obstype'], rows=['team', 'jersey', 'game'])

有没有其他方法可以做这种事情?我最初尝试将除 value 之外的所有列都放入索引然后使用 unstack(['observer', 'obstype']) . 但这在我的列层次结构中给了我一个不必要的额外级别:一个未命名的级别,其唯一的条目是 value (即我的表的内容中我实际想要的数据的列的名称) .

处理这种情况的正确方法是什么?是否像我上面那样使用 pivot_table ?还是有更好的总体策略?

1 回答

  • 4

    我也认为两者都是好的和有 Value 的选择 .
    并且在 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]
    

相关问题