/ / Организиране на колони на DataFrame в MultiIndex - python, pandas, dataframe, multi-index

Организиране на колони за DataFrame в MultiIndex - python, pandas, dataframe, multi-index

Искам да организирам колоните в моя кадър с даннив групи. Обикновено, когато правя анализ, може да имам нещо като идентификатор променливи, независими променливи и зависими променливи и мисля, че е хубаво организационно да постави всички такива променливи заедно под общи заглавия.

Ето един пример

import string
import pandas as pd

df = pd.DataFrame({"a": list(string.ascii_lowercase[:5]),
"b" : np.arange(0,5),
"c":list(string.ascii_uppercase[:5]),
"d" : np.arange(5,10)})
index1 = pd.MultiIndex.from_product([["Letter"], ["a","c"]])
index2 = pd.MultiIndex.from_product([["Number"], ["b", "d"]])
index = index1.union(index2)
df.columns = index

Това съвсем не работи.

    Letter  Number
a   c   b   d
0   a   0   A   5
1   b   1   B   6
2   c   2   C   7
3   d   3   D   8
4   e   4   E   9

Вместо това трябва да добавя

  df = df[index.get_level_values(1)]
df.columns = index

за да пренаредите колоните, така че да се подредят на мултииндекс на второ ниво, преди да променя индекса. Това се чувства малко тромаво и аз просто се чудех дали има по-добър начин да се направи това.

Отговори:

0 за отговор № 1

Ето едно добро решение:

import string
import pandas as pd

df = pd.DataFrame({"a": list(string.ascii_lowercase[:5]),
"b" : np.arange(0,5),
"c":list(string.ascii_uppercase[:5]),
"d" : np.arange(5,10)})
index1 = pd.MultiIndex.from_product([["Letter"], ["a","c"]])
index2 = pd.MultiIndex.from_product([["Number"], ["b", "d"]])
index = index1.union(index2)
df.columns = index

print(df)
Letter    Number
a  c      b  d
0      a  0      A  5
1      b  1      B  6
2      c  2      C  7
3      d  3      D  8
4      e  4      E  9

По-питонни начин на изравняване на многоиндексни колони

df.columns = df.columns.map("_".join)
print(df)

изход:

Letter_a  Letter_c Number_b  Number_d
0        a         0        A         5
1        b         1        B         6
2        c         2        C         7
3        d         3        D         8
4        e         4        E         9