熊猫:多级列名

Lon*_*Rob 25 python pandas

pandas 支持多级列名:

>>>  x = pd.DataFrame({'instance':['first','first','first'],'foo':['a','b','c'],'bar':rand(3)})
>>> x = x.set_index(['instance','foo']).transpose()
>>> x.columns
MultiIndex
[(u'first', u'a'), (u'first', u'b'), (u'first', u'c')]
>>> x
instance     first                    
foo              a         b         c
bar       0.102885  0.937838  0.907467
Run Code Online (Sandbox Code Playgroud)

此功能非常有用,因为它允许同一数据帧的多个版本"水平"附加,第一级列名称(在我的示例中instance)区分实例.

想象一下,我已经拥有了这样的数据帧:

                 a         b         c
bar       0.102885  0.937838  0.907467
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法可以为列名添加另一个级别,类似于行索引:

x['instance'] = 'first'
x.set_level('instance',append=True)
Run Code Online (Sandbox Code Playgroud)

小智 35

试试这个:

df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})

columns=[('c','a'),('c','b')]

df.columns=pd.MultiIndex.from_tuples(columns)
Run Code Online (Sandbox Code Playgroud)

  • 有人可能会喜欢 Romain [here](/sf/answers/2815805751/) 的这个答案,因为它做了类似的事情,但没有元组,因为添加了所有相同的级别。 (2认同)

Ian*_*uza 13

无需创建元组列表

用: pd.MultiIndex.from_product(iterables)

import pandas as pd
import numpy as np

df = pd.Series(np.random.rand(3), index=["a","b","c"]).to_frame().T
df.columns = pd.MultiIndex.from_product([["new_label"], df.columns])
Run Code Online (Sandbox Code Playgroud)

结果数据帧:

  new_label                    
          a         b         c
0   0.25999  0.337535  0.333568
Run Code Online (Sandbox Code Playgroud)

2014 年 1 月 25 日的拉取请求

  • 这看起来比我 5 年前选择的答案更好!我假设它从那时起就是新的,但我将选择它作为“选择的答案”。如果它是错误的或糟糕的,请在评论中告诉我。 (2认同)
  • 为什么我会收到`AttributeError:模块'pandas'没有属性'Multiindex'`..? (2认同)

Car*_*arl 8

您可以使用concat。给它提供一个数据帧字典,其中的键是要添加的新列级别。

In [46]: d = {}

In [47]: d['first_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
                                         data=[[10, 0.89, 0.98, 0.31],
                                               [20, 0.34, 0.78, 0.34]]).set_index('idx')

In [48]: pd.concat(d, axis=1)
Out[48]:
    first_level
              a     b     c
idx
10         0.89  0.98  0.31
20         0.34  0.78  0.34
Run Code Online (Sandbox Code Playgroud)

您可以使用相同的技术来创建多个级别。

In [49]: d['second_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
                                          data=[[10, 0.29, 0.63, 0.99],
                                                [20, 0.23, 0.26, 0.98]]).set_index('idx')

In [50]: pd.concat(d, axis=1)
Out[50]:
    first_level             second_level
              a     b     c            a     b     c
idx
10         0.89  0.98  0.31         0.29  0.63  0.99
20         0.34  0.78  0.34         0.23  0.26  0.98
Run Code Online (Sandbox Code Playgroud)


小智 7

其中许多解决方案似乎比实际需要的更复杂一些。

当速度不是绝对必要时,我更喜欢让事情看起来尽可能简单和直观。我认为这个解决方案可以实现这一点。早在 pandas 版本中进行了测试0.22.0

只需创建一个 DataFrame(在第一步中忽略列),然后将列设置为等于您的 n 维列名称列表。

In [1]: import pandas as pd                                                                                                                                                                                          

In [2]: df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2]])                                                                                                                                                              

In [3]: df                                                                                                                                                                                                           
Out[3]: 
   0  1  2  3
0  1  1  1  1
1  2  2  2  2

In [4]: df.columns = [['a', 'c', 'e', 'g'], ['b', 'd', 'f', 'h']]                                                                                                                                                    

In [5]: df                                                                                                                                                                                                           
Out[5]: 
   a  c  e  g
   b  d  f  h
0  1  1  1  1
1  2  2  2  2
Run Code Online (Sandbox Code Playgroud)


小智 6

x = [('G1','a'),("G1",'b'),("G2",'a'),('G2','b')]
y = [('K1','l'),("K1",'m'),("K2",'l'),('K2','m'),("K3",'l'),('K3','m')]
row_list = pd.MultiIndex.from_tuples(x)
col_list = pd.MultiIndex.from_tuples(y)

A = pd.DataFrame(np.random.randint(2,5,(4,6)), row_list,col_list)
A
Run Code Online (Sandbox Code Playgroud)

这是创建多级列和行的最简单方法。

在此输入图像描述