Pandas:多级列名

0s7z1bwu  于 2023-06-28  发布在  其他
关注(0)|答案(7)|浏览(130)

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

这个特性非常有用,因为它允许同一个 Dataframe 的多个版本“水平”地附加第一级列名(在我的示例中为instance)来区分示例。
假设我已经有一个这样的dataframe:

a         b         c
bar       0.102885  0.937838  0.907467

有没有一个好的方法来添加另一个级别的列名,类似于行索引:

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

snz8szmq1#

试试这个:

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

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

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

64jmpszr2#

无需创建元组列表
用途: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])

结果 Dataframe :

new_label                    
          a         b         c
0   0.25999  0.337535  0.333568

Pull request from Jan 25, 2014

bhmjp9jg

bhmjp9jg3#

可以使用concat。给予它一个dataframes的字典,其中的键是你想添加的新的列级别。

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

可以使用相同的方法创建多个标高。

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
wfveoks0

wfveoks04#

许多这些解决方案似乎只是比他们需要的更复杂一点。
当速度不是绝对必要的时候,我更喜欢让事情看起来尽可能简单和直观。我认为这个解决方案实现了这一点。早在0.22.0版本的pandas中进行了测试。
只需创建一个DataFrame(在第一步中忽略列),然后将colums设置为等于列名的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
yvfmudvl

yvfmudvl5#

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

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

ddrv8njm

ddrv8njm6#

这里有一个可以帮助您创建元组的函数,它可以由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)
5tmbdcev

5tmbdcev7#

通过Carl改进pd.concat方法,如果每次迭代只得到一行,情况会如何?这不是一个优化的方法,但你可以这样做:

# initial
ds = []

# first iteration (can be inside function)
d = {}
d['first_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
                                         data=[[10, 0.89, 0.98, 0.31]]).set_index('idx')
d['second_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
                                          data=[[10, 0.29, 0.63, 0.99]]).set_index('idx')
ds.append(pd.concat(d, axis=1))

# display(ds[0])

# second iteration (can be inside function)
d = {}
d['first_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
                                         data=[[20, 0.34, 0.78, 0.34]]).set_index('idx')
d['second_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
                                          data=[[20, 0.23, 0.26, 0.98]]).set_index('idx')
ds.append(pd.concat(d, axis=1))

# display(ds[1])

# final concat
pd.concat(ds, axis=0)

结果:
| | 第一级|||第二级|||
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| IDX|一种|B| c型|一种|B| c型|
| 十个|0.89| 0.98|零点三一|零点二十九|0.63| 0.99|
| | 第一级|||第二级|||
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| IDX|一种|B| c型|一种|B| c型|
| 二十个|零点三四|0.78|零点三四|零点二三|0.26| 0.98|
| | 第一级|||第二级|||
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| IDX|一种|B| c型|一种|B| c型|
| 十个|0.89| 0.98|零点三一|零点二十九|0.63| 0.99|
| 二十个|零点三四|0.78|零点三四|零点二三|0.26| 0.98|

相关问题