Подтвердить что ты не робот

pandas read_csv index_col = Ни один не работает с разделителями в конце каждой строки

Я просматриваю книгу "Python for Data Analysis" и испытываю проблемы в разделе базы данных "Пример: 2012 Федеральная избирательная комиссия", в которой данные считываются в DataFrame. Проблема в том, что один из столбцов данных всегда устанавливается как индексный столбец, даже если для параметра index_col установлено значение None.

Вот ссылка на данные: http://www.fec.gov/disclosurep/PDownload.do.

Вот код загрузки (чтобы сэкономить время при проверке, я устанавливаю nrows = 10):

import pandas as pd
fec = pd.read_csv('P00000001-ALL.csv',nrows=10,index_col=None)

Чтобы сохранить его, я исключаю вывод столбцов данных, но вот мой вывод (пожалуйста, не значения индекса):

In [20]: fec

Out[20]:
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, C00410118 to C00410118
Data columns:
...
dtypes: float64(4), int64(3), object(11)

И вот вывод книги (опять же с исключенными столбцами данных):

In [13]: fec = read_csv('P00000001-ALL.csv')
In [14]: fec
Out[14]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1001731 entries, 0 to 1001730
...
dtypes: float64(1), int64(1), object(14)

Значения индекса в моем выводе фактически являются первым столбцом данных в файле, который затем перемещает все остальные данные слева на один. Кто-нибудь знает, как предотвратить этот столбец данных, который будет указан как индекс? Я хотел бы иметь индекс только +1, увеличивая целые числа.

Я новичок в python и pandas, поэтому извиняюсь за любые неудобства. Спасибо.

4b9b3361

Ответ 1

Быстрый ответ

Используйте index_col = False вместо index_col = None, когда в конце каждой строки есть разделители, чтобы отключить вывод столбца индекса и отбросить последний столбец.

Более детально

После просмотра данных в конце каждой строки появляется запятая. И эта цитата:

index_col: номер столбца, имя столбца или список номеров/имен столбцов, чтобы использовать в качестве индекса (метки строк) результирующего кадра данных. По умолчанию он будет нумеровать строки без использования какого-либо столбца, если только нет столбца данных больше, чем заголовков, и в этом случае первый столбец принимается в качестве индекса.

Из документации видно, что pandas считает, что у вас есть n заголовков и n + 1 столбцов данных, и обрабатывает первый столбец как индекс.


РЕДАКТИРОВАТЬ 20/20/2014 - Больше информации

Я нашел еще одну ценную запись, которая конкретно касается конечных ограничителей и того, как их просто игнорировать:

Если файл имеет на один столбец данных больше, чем количество имен столбцов, первый столбец будет использоваться в качестве имен строк DataFrames:...

Обычно вы можете добиться этого, используя опцию index_col.

Есть несколько исключительных случаев, когда файл был подготовлен с разделителями в конце каждой строки данных, что сбивает с толку синтаксический анализатор. Чтобы явно отключить вывод столбца индекса и отбросить последний столбец, передайте index_col = False:...

Ответ 2

Re: craigts response, для тех, у кого возникли проблемы с использованием параметров False или None для index_col, например, в случаях, когда вы пытаетесь избавиться от индекса диапазона, вместо этого вы можете использовать целое число, чтобы указать столбец, который вы хотите использовать в качестве индекса. Например:

df = pd.read_csv('file.csv', index_col=0)

Выше будет установлен первый столбец в качестве индекса (и не добавит индекс диапазона в моем "общем случае").

Обновить

Учитывая популярность этого ответа, я решил добавить контекст/демо:

# Setting up the dummy data
In [1]: df = pd.DataFrame({"A":[1, 2, 3], "B":[4, 5, 6]})

In [2]: df
Out[2]:
   A  B
0  1  4
1  2  5
2  3  6

In [3]: df.to_csv('file.csv', index=None)
File[3]:
A  B
1  4
2  5
3  6

Чтение без index_col или с None/False приведет к индексу диапазона:

In [4]: pd.read_csv('file.csv')
Out[4]:
   A  B
0  1  4
1  2  5
2  3  6

# Note that this is the default behavior, so the same as In [4]
In [5]: pd.read_csv('file.csv', index_col=None)
Out[5]:
   A  B
0  1  4
1  2  5
2  3  6

In [6]: pd.read_csv('file.csv', index_col=False)
Out[6]:
   A  B
0  1  4
1  2  5
2  3  6

Однако, если мы укажем, что "A" (0-й столбец) на самом деле является индексом, мы можем избежать индекса диапазона:

In [7]: pd.read_csv('file.csv', index_col=0)
Out[7]:
   B
A
1  4
2  5
3  6