熊猫:多级列名

时间:2014-01-29 22:24:07

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

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

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

                 a         b         c
bar       0.102885  0.937838  0.907467

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

x['instance'] = 'first'
x.set_level('instance',append=True)

6 个答案:

答案 0 :(得分:29)

试试这个:

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

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

df.columns=pd.MultiIndex.from_tuples(columns)

答案 1 :(得分:8)

无需创建元组列表

使用: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])

结果数据框:

  new_label                    
          a         b         c
0   0.25999  0.337535  0.333568

Pull request from Jan 25, 2014

答案 2 :(得分:4)

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

aux = plt.scatter(obj_dy[:], obj_dx[:], color='green')

for k in range(len(obj_index)):
    aux1 = plt.annotate(str(obj_index[k]), xy = (obj_dy[k], obj_dx[k]))
plt.pause(0.1000)
aux.remove()
aux1.remove()

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

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

答案 3 :(得分:1)

许多这些解决方案似乎比它们需要的复杂一些。

当速度不是绝对必要时,我希望使事情看起来尽可能简单直观。我认为此解决方案可以达到目的。 早在0.22.0的熊猫版本中进行了测试。

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

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

答案 4 :(得分:0)

这是一个可以帮助您创建元组的函数,该函数可以由pd.MultiIndex.from_tuples()使用,但更为通用。从@ user3377361得到了这个想法。

def create_tuple_for_for_columns(df_a, multi_level_col):
"""
Create a columns tuple that can be pandas MultiIndex to create multi level column

:param df_a: pandas dataframe containing the columns that must form the first level of the multi index
:param multi_level_col: name of second level column
:return: tuple containing (second_level_col, firs_level_cols)
"""

temp_columns = []
for item in df_a.columns:
    temp_columns.append((multi_level_col, item))
return temp_columns

可以这样使用:

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

columns=create_tuple_for_for_columns(df, 'c')

df.columns=pd.MultiIndex.from_tuples(columns)

答案 5 :(得分:0)

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

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

enter image description here