Я вижу, что об этом спрашивали на этом сайте здесь. Заимствовал идеи из этого поста, но в моем случае не работает. Я читаю некоторые данные из листа Excel и пытаюсь преобразовать их в фрейм данных Pandas с индексом столбца и строки.
Первая строка - это заголовок года в Excel, и я попытался сделать его заголовком столбца, выполнив df.columns=df.iloc[0]
.
Поэтому, когда я запускаю df.columns
, он возвращается: Index([None, 2014.0, 2015.0, 2016.0, 2017.0, 2018.0], dtype='object', name=0)
Моя проблема теперь состоит в том, чтобы преобразовать столбец с названиями месяцев как названиями строк. я пытался
df.set_index('None',inplace=True)
Но это возвращает KeyError: 'None'
Редактировать: Добавление образца данных здесь
Обновление: я решил это с помощью df.columns = ['Month', 2014, 2015, 2016, 2017, 2018]
и df.drop(df.index[0])
да, только что добавил.
Вы можете проверить мой ответ?
Для меня хорошо работает, добавьте 2 параметра - index_col=[0]
для преобразования первого столбца в index
и usecols
с range
для выбора всех столбцов без столбца Unnamed
:
df = pd.read_excel('sample.xlsx', usecols=range(1, 100))
print (df)
Unnamed: 0 2014 2015 2016 2017 2018
0 Jan 42.9 47.2 43.000000 43.00 48.98
1 Feb 36.6 45.0 40.300000 43.00 45.92
2 Mar 37.8 42.8 44.805668 43.00 43.00
3 Apr 40.9 44.4 43.900000 41.30 44.46
4 May 40.5 47.1 44.200000 41.97 42.31
5 Jun 41.8 46.9 44.600000 45.70 NaN
6 Jul 40.5 45.0 43.500000 45.49 NaN
7 Aug 44.3 45.0 43.800000 44.59 NaN
8 Sep 43.8 47.3 47.600000 47.25 NaN
9 Oct 44.2 47.0 47.600000 50.08 NaN
10 Nov 44.2 43.7 50.078663 50.93 NaN
11 Dec 48.8 45.5 46.500000 48.37 NaN
df = pd.read_excel('sample.xlsx', index_col=[0], usecols = range(1, 100))
print (df)
2014 2015 2016 2017 2018
Jan 42.9 47.2 43.000000 43.00 48.98
Feb 36.6 45.0 40.300000 43.00 45.92
Mar 37.8 42.8 44.805668 43.00 43.00
Apr 40.9 44.4 43.900000 41.30 44.46
May 40.5 47.1 44.200000 41.97 42.31
Jun 41.8 46.9 44.600000 45.70 NaN
Jul 40.5 45.0 43.500000 45.49 NaN
Aug 44.3 45.0 43.800000 44.59 NaN
Sep 43.8 47.3 47.600000 47.25 NaN
Oct 44.2 47.0 47.600000 50.08 NaN
Nov 44.2 43.7 50.078663 50.93 NaN
Dec 48.8 45.5 46.500000 48.37 NaN
Или выберите второй столбец для индекса и удалите столбец Unnamed: 0
:
df = pd.read_excel('sample.xlsx', index_col=[1])
print (df)
Unnamed: 0 2014 2015 2016 2017 2018
Jan NaN 42.9 47.2 43.000000 43.00 48.98
Feb NaN 36.6 45.0 40.300000 43.00 45.92
Mar NaN 37.8 42.8 44.805668 43.00 43.00
Apr NaN 40.9 44.4 43.900000 41.30 44.46
May NaN 40.5 47.1 44.200000 41.97 42.31
Jun NaN 41.8 46.9 44.600000 45.70 NaN
Jul NaN 40.5 45.0 43.500000 45.49 NaN
Aug NaN 44.3 45.0 43.800000 44.59 NaN
Sep NaN 43.8 47.3 47.600000 47.25 NaN
Oct NaN 44.2 47.0 47.600000 50.08 NaN
Nov NaN 44.2 43.7 50.078663 50.93 NaN
Dec NaN 48.8 45.5 46.500000 48.37 NaN
df = pd.read_excel('sample.xlsx', index_col=[1]).drop('Unnamed: 0', axis=1)
print (df)
2014 2015 2016 2017 2018
Jan 42.9 47.2 43.000000 43.00 48.98
Feb 36.6 45.0 40.300000 43.00 45.92
Mar 37.8 42.8 44.805668 43.00 43.00
Apr 40.9 44.4 43.900000 41.30 44.46
May 40.5 47.1 44.200000 41.97 42.31
Jun 41.8 46.9 44.600000 45.70 NaN
Jul 40.5 45.0 43.500000 45.49 NaN
Aug 44.3 45.0 43.800000 44.59 NaN
Sep 43.8 47.3 47.600000 47.25 NaN
Oct 44.2 47.0 47.600000 50.08 NaN
Nov 44.2 43.7 50.078663 50.93 NaN
Dec 48.8 45.5 46.500000 48.37 NaN
Спасибо, Джезраэль. что именно делает usecols = range (1, 100)? проверил документацию, но объяснений нет. Я пробовал методы других людей, но трудно избавиться от этой ненужной строки, когда заголовок года становится строкой в фрейме данных.
@W_YY - Ответ отредактирован, usecols
- фильтр - столбцы по именам, очевидно, но возможны и позиции прохода, можно проверить с помощью df = pd.read_excel('sample.xlsx', usecols=[1,2,4])
Я думаю, вы предоставили другой путь, чтобы избежать проблемы. Я использовал openpyxl import load_workbook вместо pd.read_excel.
Вы можете переименовать свои столбцы следующим образом:
df.columns = ['None', 2014.0, 2015.0, 2016.0, 2017.0, 2018.0]
Теперь ваша команда должна работать
Спасибо! Я только что изменил 2014.0 на 2014 как название года. Метод работал, чтобы установить столбец месяца в качестве имен индекса строки. И теперь индекс df выглядит так: Index ([None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', ' Oct ',' Nov ',' Dec '], dtype =' object ', name =' Месяц ')
Однако возникла новая проблема, когда ненужная строка не может быть удалена с помощью вызова df.drop ([0])
Попробуй так
df.set_index(df.None)
С именем столбца «Никто» вы не можете установить его как индекс, поэтому, чтобы установить этот столбец как индекс, сначала переименуйте этот столбец.
df.columns.values[0]='First'
А затем установите его как индекс как -:
df.set_index('First')
Можно ли поделиться образцом Excel с помощью Dropbox, googledocs или аналогичного? Потому что это кажется проблемой, связанной с данными.