Видалення індексного стовпця в пандах під час читання CSV


128

У мене є такий код, який імпортує файл CSV. Є 3 стовпчики, і я хочу встановити перші два з них на змінні. Коли я встановлюю другий стовпчик на змінну "ефективність", на нього також розміщується індексний стовпчик. Як я можу позбутися стовпчика індексу?

df = pd.DataFrame.from_csv('Efficiency_Data.csv', header=0, parse_dates=False)
energy = df.index
efficiency = df.Efficiency
print efficiency

Я спробував використовувати

del df['index']

після того, як я встановив

energy = df.index

яку я знайшов в іншій публікації, але це призводить до "KeyError: 'index" "

Відповіді:


70

DataFrames і Series завжди мають індекс. Хоча він відображається поряд із стовпцями (колонами), це не стовпець, через що del df['index']він не працював.

Якщо ви хочете замінити індекс простими послідовними числами, використовуйте df.reset_index().

Щоб зрозуміти, чому індекс є і як він використовується, див., Наприклад, 10 хвилин до Панди .


1
Дякую! Я вирішив просто імпортувати його іншим способом, не використовуючи панди. Я повинен виконати деяку арифметику на кожному з стовпців, і python не сподобався, якщо індексний стовпчик додається. Панди, безумовно, найпростіший спосіб імпорту даних, але не завжди найкращий, про який я дізнався.
Богдан Янішевський

2
Ви намагалися використовувати Pandas для арифметики?
Джеймі Булл

1
чи можна видалити ім'я індексу?
Quant

3
Так, index.name = None.
Ден Аллан

1
@BogdanJaniszewski, якщо ви не використовували панди, то чому ви прийняли це як відповідь?
багатоповерховий

249

Під час читання у файл CSV та з нього включайте аргумент, index=Falseнаприклад:

 df.to_csv(filename, index=False)

і читати з csv

df.read_csv(filename, index=False)  

Це має запобігти проблемі, тому вам не потрібно виправляти її пізніше.


8
Велике спасибі. Саме це питання шукає.
Блідо-блакитна крапка

1
"header = False" працює таким же чином для видалення заголовків
J.Dahlgren

29
повинно бути index_col=False.
Веда

1
Використання df.to_sql("table",cursor,if_exists="append",index=False)також виправляє помилку sqlitesqlite3.OperationalError: table message has no column named index
Анна

1
@vedda це , здається, index=Falseдля to_excel()і index_col=Falseз read_csv()в панд 0.23.4. : - /
matt wilkie

70

df.reset_index(drop=True, inplace=True)


2
Це насправді моє улюблене рішення, але не дуже детальна відповідь. Посібник читає це про аргумент drop: "Не намагайтеся вставити індекс у стовпці фрейму даних. Це скидає індекс до цілого індексу за замовчуванням." pandas.pydata.org/pandas-docs/stable/generated/…
tommy.carstensen

@ tommy.carstensen Тоді як би уникнути отримання цілих чисел на індекс як заміну попереднього індексу? Я думаю, що це нерозуміння тексту вашого посилання. Тут питання полягає в тому, щоб скинути індекс . І цього тут досягнуто. Ви отримуєте цілі числа за замовчуванням, оскільки немає жодної рамки дат без індексу, але ви скинули попередній індекс. Ось чому ця відповідь має бути прийнятою відповіддю, також тому, що вона використовує пам'ять ефективно inplace=True.
Лоренц

13

Ви можете встановити один із стовпців як індекс, якщо, наприклад, це "id". У цьому випадку стовпчик індексу буде замінений одним із вибраних вами стовпців.

df.set_index('id', inplace=True)

3

Якщо ваша проблема така ж, як у мене, де ви просто хочете скинути заголовки стовпців від 0 до розміру стовпця. Зробіть

df = pd.DataFrame(df.values);

Редагувати:

Недобра ідея, якщо у вас є різнорідні типи даних. Краще просто використовувати

df.columns = range(len(df.columns))

2

Ви можете вказати, який стовпець є індексом у файлі csv, скориставшись параметром index_col функції from_csv, якщо це не вирішує Вашу проблему, надайте приклад Ваших даних


2

Одне, що я роблю, - це df=df.reset_index() тодіdf=df.drop(['index'],axis=1)


Помилка: "Мітки [" індекс "] не містяться у осі"
Васин Юрій

@VasinYuriy це мається на увазі як df.reset_index().drop(columns=['yourfirstindex', 'yoursecondindex']), він працює з 'індексом' лише в стандартному випадку, якщо індекс не має імені, а потім стає стовпцем, який називається 'індекс' df.reset_index().drop(columns=['index']). Доданий параметр axis=1є типовим. Цей метод не рекомендується, @ SubhojitMukherjee reset_index(inplace=True)працює "на місці" і тим самим економить пам'ять.
Лоренц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.