#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