Загрузка таблицы панд с именами столбцов и dtypes - PullRequest
0 голосов
/ 26 октября 2018

Я довольно новичок в использовании Pandas и, похоже, у меня возникли некоторые проблемы при загрузке таблицы из текстового файла.

Вот пример того, как выглядят данные:

#    Header text
#    Header text
# id col1 col2 col3 col4
0 0.44:66 0 1600 45.6e-3
1 0.25:7f 0 1600 52.1e-3
2 0.31:5e 0 1600 33.7e-3
...
2500 0.42.6f 0 1400 42.1e-3
# END
# Footer text

Я читаю это следующим образом:

import pandas as pd

with open(filename, 'rt') as f:
    df = pd.read_table(f, skiprows=2, skipfooter=2, engine='python')

Тогда, когда я print(df.dtypes), я получаю следующее:

# id        int64
col1        object
col2        int64
col3        int64
col4        float64
dtype: object

Это нормально, за исключением # в названии первого столбца. Поэтому я попытался указать имена:

df = pd.read_table(f, skiprows=2, skipfooter=2, engine='python', 
                   names=["id", "col1", "col2", "col3", "col4"])

но тогда я получаю print(df.dtypes)

id          object
col1        object
col2        object
col3        object
col4        object
dtype: object

Итак, я попытался указать names и dtypes:

df = pd.read_table(f, skiprows=2, skipfooter=2, engine='python', 
                   names=["id", "col1", "col2", "col3", "col4"], 
                   dtypes={"id":int,"col1":str,"col2":int, "col3":int,"col4":float})

но это выдает ошибку:

ValueError: Unable to convert column id to type <class 'int'>

Что не так? Как я могу загрузить таблицу с колонкой names, которую я хочу, и соответствующей dtypes?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Используйте astype

df['id'] = df['id'].astype(int)
0 голосов
/ 26 октября 2018

Несколько комментариев.

Во-первых, я не понимаю, почему ваш код работает вообще, учитывая, что столбцы разделены пробелом (?). Обычно вам потребуется дополнительно sep=' ' при звонке на read_table или read_csv.

Во-вторых, вам не нужно сначала открывать файл, вы можете просто передать имя файла функции pandas: pd.read_table(filename, ...)

Но чтобы ответить на ваш вопрос:

Если вы явно укажете имена столбцов с помощью names=[...], и они не будут совпадать с заголовком файла, pandas предполагает, что заголовок отсутствует. Поэтому вам нужно пропустить дополнительную строку (skiprows=3), иначе pandas будет считать, что строка является частью данных таблицы, и, таким образом, установить тип данных object (т.е. строки) для всех столбцов.

0 голосов
/ 26 октября 2018

Я нашел обходное решение, но я готов к лучшим решениям, если они есть.

Я загрузил таблицу без указания names или dtypes, а затем переименовал проблемное имя столбца в:

df = pd.read_table(f, skiprows=2, skipfooter=2, engine='python')
df.rename(columns={'# id':'id'}, inplace=True)

Затем я использовал print(df.dtypes), чтобы получить желаемый результат:

id          int64
col1        object
col2        int64
col3        int64
col4        float64
dtype: object
...