Как читать CSV, не изменяя оригинальные типы данных в пандах - PullRequest
0 голосов
/ 09 ноября 2018

Я читаю csv и не хочу, чтобы типы данных столбцов были объектами, они должны быть int, float, str и т. Д.

data = pd.read_csv(file_path+files, delimiter='\t', error_bad_lines=False)

data.dtypes:
  Time       object
  Code        int64
  Address     object
  dtype: object

Есть ли какой-нибудь способ, которым мы могли бы читать типы данных изначально, как они взяты из csv при чтении:

Ожидаемое:

data.dtypes:
  Time        int
  Code        int64
  Address     str

У меня есть датафрейм, похожий на:

df:
    A     B    C
    abc   10   20
    def   30   50  
    cfg   90   60
    pqr   str  50
    xyz   75   56

Я хочу избавиться от строки, в которой столбец «B» не является «int». Поскольку d-тип B установлен как «объект», я не могу этого сделать.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы можете легко конвертировать столбцы для числовых типов:

data['Time'] = data['Time'].astype(int)

Dtype для вашего строкового поля застрял как объект, потому что это строковый объект. Я полагаю, что было бы возможно создать новый dtype, который явно является строкой, но я не знаю никаких преимуществ для этого.

Для вашей отредактированной задачи вам нужно определить конвертер (поскольку ваш файл НЕ имеет определенного типа данных для столбца)

import numpy as np

def col_fixer(x):
    try:
        return int(x)
    except ValueError:
        return np.nan

data = pd.read_csv(file_path+files, delimiter='\t', converters=dict(B=col_fixer))

Затем вы можете отбрасывать строки с помощью NA, как хотите.

0 голосов
/ 09 ноября 2018

Вы можете поставить dtype kwarg на read_csv(). Из документов:

dtype: введите имя или имя столбца -> тип, по умолчанию нет

Тип данных для данных или столбцов. Например. {‘A’: np.float64, ‘b’: np.int32} Используйте str или object вместе с подходящими настройками na_values, чтобы сохранить, а не интерпретировать dtype. Если указаны конвертеры, они будут применены ВМЕСТО преобразования dtype.

, например

data = pd.read_csv(..., dtype={'Time': np.int64})

Редактировать : Как указывает @ALollz, это прекратится, если данные в указанных столбцах не могут быть преобразованы. Обычно он используется, если вы хотите считывать данные с использованием разного количества битов (например, np.int32 вместо np.int64).

Вы можете использовать df['Time'].astype(int) в DataFrame с ojbect s, чтобы диагностировать, какие данные вызывают проблему преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...