Как сортировать мультииндексные столбцы в Pandas - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь манипулировать множеством многоиндексных массивов панд. Каждый столбец представляет собой временной ряд с различными категориальными группировками. Я хотел бы отсортировать данные, а затем проанализировать все категории и затем выполнить некоторые дополнительные манипуляции с данными. Вот пример кода того, что я пытался, но не сработало

import pandas as pd
import numpy as np
df=pd.DataFrame({'t': range(1,11)})
df.set_index(['t'],inplace=True)

for num in range(2):
    labely = (str(num),'A','y')
    labelx = (str(num),'A','x')
    labelbx = (str(num),'B','x')
    df[labelx]= np.random.randn(10)
    df[labelbx]= np.random.randn(10)
    df[labely]= np.random.randn(10)+range(1,11)

df.columns = pd.MultiIndex.from_tuples(df.columns, names=['ID','Location','Direction']) 

df[('0','A','tot')]=df[('0','A','y')]+df[('0','A','x')]
df.sort_index(level='ID',inplace=True)
df.head()

Это не сортирует. Это результат с итогом, не сгруппированным с другим 0 ID, и местоположениями, не сгруппированными вместе:

ID                0                        ...            1                   0
Location          A         B         A    ...            B         A         A
Direction         x         x         y    ...            x         y       tot
t                                          ...                                 
1          0.430386 -0.121109  0.263314    ...     0.243839  0.313505  0.693700
2         -1.262746 -0.678889  1.289814    ...    -0.893230  0.373103  0.027068
3          0.245483 -0.565859  3.766628    ...     0.012933  1.652484  4.012111
4          1.518357  0.447032  5.649877    ...    -1.205161  5.513507  7.168233
5         -0.095216 -0.571333  6.794958    ...    -0.777933  4.073334  6.699741

У меня есть 2 вопроса, связанных с этим.

  1. Как отсортировать столбцы так, чтобы каждый из уровни
  2. Как мне эффективно проанализировать данные, чтобы сделать дополнительные манипуляции с данными.

Это код sudo для второго вопроса

for id in ID: 
     for loc in Location:
               df[(id,loc,'tot')=df[(id,loc,'x')]+df[(id,loc,'y')]

1 Ответ

0 голосов
/ 04 сентября 2018

Сортировать по столбцам, как ответил Ян на оси = 1:

df.sort_index(level='ID',axis=1,inplace=True)

Чтобы получить список кортежей уникальных имен столбцов для анализа, мне нужны были columns.values, а затем я пересчитал после вычислений.

for id,loc,dir in df.columns.values:
    df[(id,loc,'tot')]=(df[(id,loc,'x')]**2+df[(id,loc,'y')]**2)**.5
df.sort_index(level='ID',axis=1,inplace=True)

Поскольку это базовые вычисления столбцов, я думаю, что этот метод будет эффективным.

...