将DataFrame列组织到MultiIndex中

时间:2016-04-01 14:26:46

标签: 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

重新排列列,以便在更改索引之前它们与第二级多索引对齐。这感觉有点笨拙,我只是想知道是否有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

这是一个很好的解决方案:

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

更多pythonic方式扁平化多索引柱

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