Панды используют несколько строк для столбца MultiIndex в DataFrame - PullRequest
0 голосов
/ 14 июня 2019

Когда вы загружаете CSV в pandas, вы можете легко указать количество строк, которые будут использоваться в качестве индексов столбцов, например:

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

Но как вы производите тот же самый результат из Dataframe в памяти? Как вы просто указываете, какой набор строк должен использоваться для индекса столбца?

Конечно, не пройдя этот хак:

>>> 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 Ответ

2 голосов
/ 14 июня 2019

Ваше альтернативное решение должно быть немного улучшено:

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
...