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, поэтому извиняюсь за любые неудобства. Спасибо.
Ответы
Ответ 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