Предупреждение о производительности DataFrame

avatar
Ngoral
7 апреля 2018 в 23:54
2295
2
3

Я получаю предупреждение о производительности от Pandas

/usr/local/lib/python3.4/dist-packages/pandas/core/generic.py:1471: 
PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed-integer,key->block0_values] [items->['int', 'str']]

Я читал несколько выпусков на github и вопросы здесь, и все они говорят, что это потому, что я смешиваю типы в одном столбце, но это определенно не так. Вот простой пример:

import pandas as pd
df = pd.DataFrame(columns=['int', 'str'])
df = df.append({ 'int': 0, 'str': '0'}, ignore_index=True)
df = df.append({ 'int': 1, 'str': '1'}, ignore_index=True)
for _, row in df.iterrows():
   print(type(row['int']), type(row['str']))

# <class 'int'> <class 'str'>
# <class 'int'> <class 'str'>

# however
df.dtypes
# int    object
# str    object
# dtype: object

# the following causes the warning
df.to_hdf('table.h5', 'table')

Что это может быть и что я могу сделать?

Источник
jpp
8 апреля 2018 в 00:10
0

Вы пытались преобразовать числовые столбцы в числовые? Например, df[col] = df[col].astype(int) ?

Ngoral
8 апреля 2018 в 00:27
0

@jpp Вау! Вот и все! Спасибо! Я просто немного неопытен, чтобы не знать, что это необходимо, или это уловка?

jpp
8 апреля 2018 в 01:08
0

см. ответ ниже.

Ответы (2)

avatar
jpp
8 апреля 2018 в 01:07
2

Вам необходимо преобразовать серию фреймов данных в числовые типы, где это уместно.

Есть 2 основных способа добиться этого для целых чисел:

# Method 1
df['col'] = df['col'].astype(int)

# Method 2
df['col'] = pd.to_numeric(df['col'], downcast='integer')

Это обеспечивает правильное сопоставление типов данных с типами C и, таким образом, позволяет хранить данные в формате HDF5 (который использует PyTables) без необходимости обработки.

avatar
JonR
29 сентября 2021 в 09:20
0

Основываясь на ответе @jpp, я проследил эту проблему в своих собственных данных до использования по умолчанию типов данных int64 и float64 при загрузке большого CSV-файла в фрейм данных pandas.

Решено:

for c in df.columns[df.dtypes=='float64'].values:
        df[c] = df[c].astype('float')
    
    for c in df.columns[df.dtypes=='int64'].values:
        df[c] = df[c].astype('int')

Теперь можно экспортировать в HDF без предупреждений. Конечно, вы могли бы автоматизировать это, но для моих целей этого было «достаточно хорошо».