Существует два сценария:
- Вы знаете и поэтому можете заранее указать оптимальный тип для каждого столбца;или
- Вы не знаете оптимальные типы заранее и должны конвертировать в оптимальные типы после чтения файла.
Укажите заранее
Это простой случай.Используйте словарь:
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""")