Как загрузить Pandas DataFrame из csv / tsv в качестве факторизованного типа категории? - PullRequest
0 голосов
/ 21 марта 2020

У меня огромный набор данных TSV (genomi c) (размер 1 ГБ), который имеет 2 504 строки и 220 001 столбец. (Для загрузки с pd.read_table("biallelic-only.raw").

требуется 1 час 11 минут 4 секунды. Все столбцы, кроме 5, являются категориальными данными, и я хочу преобразовать их в категорию факторизации.

С небольшими выборками , этот код хорошо обращается:

data = pd.read_table("biallelic-only.raw")
categorical_feats = [
    f for f in data.columns if f not in ['FID', 'IID', 'PAT', 'MAT', 'bmi']
]

categorical_feats
for f in categorical_feats:
    data[f], _ = pd.factorize(data[f])
    data[f] = data[f].astype('category')

Но с этим огромным, он требует возрастов.

Мой вопрос, возможно ли загрузить набор данных уже как разложенные категории вместо преобразования позже?

Я знаю, что мы можем сделать что-то вроде:

pd.read_csv('file', dtype={'col_name':type}))

Но, учитывая, что у меня 220 001 столбец, невозможно установить все их в словарь dtype. Интересно, есть ли перевернутый способ назначения типа. Что-то вроде: установите все столбцы как category, кроме этих 5).

Спасибо!

1 Ответ

2 голосов
/ 21 марта 2020

Считайте данные как категориальные и укажите конвертер для столбцов исключение , например, предполагая, что игрушечный файл с именем 'data.csv' содержит следующие данные:

name  type   cost
AB     B      1
CV     G      4
54     B      31
AB     B      2

Вы можете do:

import pandas as pd

df = pd.read_csv('data.csv', dtype='category', converters={'cost': int}, delim_whitespace=True)
print(df.dtypes)

Выход

name    category
type    category
cost       int64
dtype: object

В приведенном выше примере стоимость - это столбец исключения, в вашем случае это должно быть ['FID', 'IID', 'PAT', 'MAT', 'bmi']. Обратите внимание, что словарь конвертеров будет зависеть от вашего типа данных (в примере cost - это целочисленный столбец).

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