Импорт многоиндексированных данных без создания целочисленных имен столбцов

1

У меня есть проблема с импортом данных из файла excel с вложенными названиями столбцов. Несколько имен столбцов являются целыми числами, и я хотел бы иметь их как строки.

Скажем, у меня есть эта таблица в excel:

|     | 1                 | string_name       |                   |
|-----|-------------------|-------------------|-------------------|
| cat | value1            | value2            | value3            |
| A   | 0,972040109825603 | 0,056557228055112 | 0,976955685101913 |
| B   | 0,320747613034341 | 0,149341390123682 | 0,638191659714267 |
| C   | 0,790582690075218 | 0,72042597879107  | 0,001334403836215 |
| D   | 0,536830294783296 | 0,374625041462985 | 0,400407699629966 |
| E   | 0,407865892894399 | 0,622162974355068 | 0,374418521692358 |

Я импортирую его как файл данных

df = pd.read_excel('expl.xlsm', header=[0, 1])

print(df)

который дает

            1           string_name
cat    value1    value2      value3
A    0.972040  0.056557    0.976956
B    0.320748  0.149341    0.638192
C    0.790583  0.720426    0.001334
D    0.536830  0.374625    0.400408
E    0.407866  0.622163    0.374419

В:

df.columns

ИЗ:

MultiIndex(levels=[[1, 'string_name'], ['value1', 'value2', 'value3']],
       labels=[[0, 0, 1], [0, 1, 2]],
       names=[None, 'cat'])

Поэтому я хочу преобразовать 1 в '1'. Или, в идеале, импортируйте файл данных только с именами столбцов строкового типа.

Я получаю значения столбца первого уровня на

df.columns.get_level_values(0)

ИЗ:

Index([1, 1, 'string_name'], dtype='object')

Но

df.columns.get_level_values(0) = df.columns.get_level_values(0).astype(str)

возвращает ошибку:

df.columns.get_level_values(0) = df.columns.get_level_values(0).astype(str)                                                                        

SyntaxError: can't assign to function call

Как я могу изменить тип данных имен столбцов или импортировать данные только с заголовками столбцов строк?

Теги:
pandas
excel
import
multi-index

1 ответ

1
Лучший ответ

Вам нужно создать новый MultiIndex и назначить обратно:

a = df.columns.get_level_values(0).astype(str)
b = df.columns.get_level_values(1)

df.columns = pd.MultiIndex.from_arrays([a,b], names=df.columns.names)

print (df.columns)
MultiIndex(levels=[['1', 'string_name'], ['cat', 'value1', 'value2']],
           labels=[[0, 0, 1], [0, 1, 2]],
           names=[None, 'cat'])

Если хотите фильтровать только значения строк в первом уровне MultiIndex, возможно создать булевую маску и фильтр с помощью boolean indexing с loc:

mask = df.columns.get_level_values(0).map(lambda x: isinstance(x, str))

df1 = df.loc[:, mask]
print (df1)
  string_name
       value2
A    0.976956
B    0.638192
C    0.001334
D    0.400408
E    0.374419
  • 1
    Большой! Это сработало!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню