熊猫对DataFrame中的列MultiIndex使用几行

时间:2019-06-14 10:35:29

标签: pandas dataframe indexing multi-index

在熊猫中加载CSV时,您可以轻松地指定用作列索引的行数,例如:

import pandas
from six import StringIO
df = """a | X | X  | Y | Y  | Z  | Z
        b | C | N  | C | N  | C  | N
        c | i | i  | i | j  | j  | j
        d | 3 | 10 | 4 | 98 | 81 | 0"""
df = StringIO(df.replace(' ',''))
df = pandas.read_csv(df, sep="|", header=[0,1,2])

>>> df
   a  X      Y       Z
   b  C   N  C   N   C  N
   c  i   i  i   j   j  j
0  d  3  10  4  98  81  0

但是如何从内存中的数据帧产生相同的结果?您如何简单地指定应为列索引使用哪组行?

当然不会经历此hack:

>>> df

   0  1   2  3   4   5  6
0  a  X   X  Y   Y   Z  Z
1  b  C   N  C   N   C  N
2  c  i   i  i   j   j  j
3  d  3  10  4  98  81  0

path = '~/test/temp.csv'
df.to_csv(path, header=None, index=None)
df = pandas.read_csv(path, header=[0,1,2])

甚至是这种骇客:

>>> df

   0  1   2  3   4   5  6
0  a  X   X  Y   Y   Z  Z
1  b  C   N  C   N   C  N
2  c  i   i  i   j   j  j
3  d  3  10  4  98  81  0

df = df.transpose().set_index([0,1,2]).transpose()

我尝试使用此方法,但它不接受axis参数:

df.set_index(['a', 'b', 'c'], axis=1)

1 个答案:

答案 0 :(得分:2)

您的替代解决方案应有所改进:

df = df.T.set_index([0,1,2]).T

另一种无需移调的解决方案:

df.columns = pd.MultiIndex.from_tuples(df.iloc[:3].apply(tuple))
df = df.iloc[3:].reset_index(drop=True)
print (df)
   a  X      Y       Z   
   b  C   N  C   N   C  N
   c  i   i  i   j   j  j
0  d  3  10  4  98  81  0