Panda:在索引中添加一个子级别,这个索引依赖于上层

时间:2017-05-01 11:07:10

标签: python pandas matrix dataframe indexing

Possible duplicates但由于我得到的信息,那里提供的解决方案无法解决我的问题。

这个想法非常简单。我有一个多级的矩阵(在我的情况下,我没有构建索引,我只得到DataFrame):

#test = (('2','C'),('2','B'),('1','A'))
#test = pd.MultiIndex.from_tuples(test)
#pandas.dataFrame(index=test, columns=test)
        2                1
        C        B       A
2   C   NaN     NaN     NaN
    B   NaN     NaN     NaN
1   A   NaN     NaN     NaN

我想在A,B,C的两个轴上添加一个子级。例如:

            2                1
            C        B       A
            kg       kg      m3
2   C   kg  NaN     NaN     NaN
    B   kg  NaN     NaN     NaN
1   A   m3  NaN     NaN     NaN

实际上索引可以通过DataFrame获得(我没有构建它),我只知道这个:{'C':'kg','B':'kg','A':'m3 “}。我可以得到索引系列,并使用类似于上面链接的方法,但它非常慢,我无法想象有更简单,更有效的东西。

2 个答案:

答案 0 :(得分:1)

来源DF:

In [303]: df
Out[303]:
       2         1
       C    B    A
2 C  NaN  NaN  NaN
  B  NaN  NaN  NaN
1 A  NaN  NaN  NaN

解决方案:

In [304]: cols = df.columns

In [305]: new_lvl = [d[c] for c in df.columns.get_level_values(1)]

In [306]: df.columns = pd.MultiIndex.from_arrays([cols.get_level_values(0), 
                                                  cols.get_level_values(1),
                                                  new_lvl])

In [307]: df
Out[307]:
       2         1
       C    B    A
      kg   kg   m3
2 C  NaN  NaN  NaN
  B  NaN  NaN  NaN
1 A  NaN  NaN  NaN

其中d是:

In [308]: d = {'C':'kg', 'B':'kg', 'A':'m3'}

In [309]: d
Out[309]: {'A': 'm3', 'B': 'kg', 'C': 'kg'}

答案 1 :(得分:0)

您可以使用set_index(..., append=True)添加新索引

test = (('2','C'),('2','B'),('1','A'))
test = pd.MultiIndex.from_tuples(test)
x = pd.DataFrame(index=test, columns=test)

# add new index
x['new'] = pd.Series(x.index.get_level_values(-1), index=x.index).replace({'C':'kg', 'B':'kg', 'A':'m3'})
x.set_index('new', append=True, inplace=True)
x.index.names = [None] * 3

# transpose dataframe and do the same thing
x = x.T
x['new'] = pd.Series(x.index.get_level_values(-1), index=x.index).replace({'C':'kg', 'B':'kg', 'A':'m3'})
x.set_index('new', append=True, inplace=True)
x.index.names = [None] * 3
x = x.T