ошибка памяти pandas при преобразовании столбца большого csv из string в float

#python #pandas #memory

#python #pandas #память

Вопрос:

У меня большой csv (~ 20 миллионов строк), и я хотел бы преобразовать один столбец из string в float. Я делаю так:

 df['sale']=df['sale'].str.replace(",", ".").astype('float32')
  

и продажа выглядит так:

 86,2600
20,2800 
123,5000
30,7500
8,3600
  

Команда кажется нестабильной, т.Е. Иногда выдает следующую ошибку памяти:

Ошибка отслеживания памяти (последний последний вызов) в () —-> 1 df[‘sale’]=df[‘sale’].str.replace(«,», «.»). astype(‘float32’);

Что это за ошибка и как я могу ее исправить? Спасибо!

Комментарии:

1. насколько велик столбец

2. Просто скажите pandas, чтобы он обрабатывал это как десятичный разделитель pd.read_csv(FILENAME, decimal=',') при чтении, чтобы он преобразовывался при чтении

3. @EdChum похоже, в этом и есть хитрость! Спасибо

4. Если это сработает, дайте мне знать, и я опубликую ответ

5. может быть, numpy более эффективен с памятью? импортируйте numpy как np df[‘sale’]=np.core.defchararray.replace(df[‘sale’].values, ‘,’, ‘.’). astype(‘float32’)

Ответ №1:

Вместо преобразования после загрузки, что требует больших затрат памяти. Вы можете указать, что десятичный разделитель является европейским стилем, передав параметр decimal=',' read_csv :

 pd.read_csv(FILENAME, decimal=',')
  

Пример:

 In[24]:
t="""data
86,2600
20,2800 
123,5000
30,7500
8,3600"""
df = pd.read_csv(io.StringIO(t), decimal=',', sep=';')
df

Out[24]: 
     data
0   86.26
1   20.28
2  123.50
3   30.75
4    8.36
  

Обратите внимание, что я передаю sep=';' , иначе он будет обрабатывать вышеуказанное как 2 столбца, поскольку разделителем по умолчанию является запятая.

Мы видим, что вывод показывает, что он десятичный, и мы можем подтвердить dtype использование .info() :

 df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 1 columns):
data    5 non-null float64
dtypes: float64(1)
memory usage: 120.0 bytes