Определение типа данных при импорте файла CSV на основе индекса столбца в пандах - PullRequest
0 голосов
/ 24 октября 2018

Мне нужно импортировать CSV-файл, имеющий более 300 столбцов, среди этих столбцов только первый столбец должен быть указан в качестве категории, в то время как остальные столбцы должны быть плавающими 32 или менее.Я предполагаю, что я мог бы указать типы данных столбцов через индексы столбцов.Мой вопрос: каков оптимальный способ указать типы данных на основе индексов столбцов?

Col_A   Col_B   Col_C   Col_D
001       1       2      1.2
002       2       3      3.5
003       3       4.5      7
004       4       6.5     10

Код, который я пробовал:

df = pd.read_csv(path, low_memory=False,  
             dtype={'Col_A': 'category', [2:]: np.float32)}

Ответы [ 3 ]

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

Существует два сценария:

  1. Вы знаете и поэтому можете заранее указать оптимальный тип для каждого столбца;или
  2. Вы не знаете оптимальные типы заранее и должны конвертировать в оптимальные типы после чтения файла.

Укажите заранее

Это простой случай.Используйте словарь:

type_dict = {'Col_A': 'category', 'Col_B': 'int16',
             'Col_C': 'float16', 'Col_D': 'float32'}

df = pd.read_csv(myfile, delim_whitespace=True, dtype=type_dict)

Если вы не знаете названия столбцов заранее, просто прочитайте столбцы как начальный шаг:

cols = pd.read_csv(myfile, delim_whitespace=True, nrows=0).columns
# Index(['Col_A', 'Col_B', 'Col_C', 'Col_D'], dtype='object')

type_dict = {'Col_A': 'category', **{col: 'float32' for col in cols[1:]}}

df = pd.read_csv(myfile, delim_whitespace=True, dtype=type_dict)

Укажите после прочтения

Зачастую вы не знаете заранее тип оптимальный .В этом случае вы можете читать данные как обычно и выполнять преобразования для int и float явным образом на следующем шаге:

df = pd.read_csv(myfile, delim_whitespace=True, dtype={'Col_A': 'category'})

cols = {k: df.select_dtypes([k]).columns for k in ('integer', 'float')}

for col_type, col_names in cols.items():
    df[col_names] = df[col_names].apply(pd.to_numeric, downcast=col_type)

print(df.dtypes)

Col_A    category
Col_B        int8
Col_C     float32
Col_D     float32
dtype: object

Настройка, используемая для тестирования

from io import StringIO

myfile = StringIO("""Col_A   Col_B   Col_C   Col_D
001       1       2      1.2
002       2       3      3.5
003       3       4.5      7
004       4       6.5     10""")
0 голосов
/ 24 октября 2018

Я думаю, что следующее будет служить цели:

df = pd.read_csv(path, low_memory=False, dtype={'Col_A':'category'})

или, если вы знаете, это будет первый столбец:

df = pd.read_csv(path, low_memory=False, dtype={0:'category'})
0 голосов
/ 24 октября 2018

прочитайте его дважды, первый раз получите все столбцы, второй раз укажите dtype при чтении.

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
df.to_csv('tmp.csv',index=False)

path = 'tmp.csv'
df =pd.read_csv(path)
type_dict = {}

for key in df.columns:
    if key == 'A':
        type_dict[key]='category'
    else:
        type_dict[key]=np.float32
df = pd.read_csv(path,dtype=type_dict)
print(df.dtypes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...