#python #dataframe #dask
#python #фрейм данных #dask
Вопрос:
У меня есть фрейм данных dask со столбцом «is_internal» типа int64. Я хочу обновить это аналогично инструкции SQL case:
CASE WHEN ltrim(rtrim(is_internal)) = '1' then 'Internal' else 'External' END as type
импорт данных в виде:
import pandas as pd
import dask.dataframe as dd
import time
t=time.process_time()
df_train = dd.read_csv(r"C:test.bcp", sep='t', sample=25000000)
Обычно в pandas я бы сделал что-то похожее на это, но это занимает много места, в котором я ограничен.
df_train.loc[df_train['is_internal'] == 1, 'type'] = 'internal'
df_train.loc[df_train['is_internal'] == 0, 'type'] = 'external'
Каков наилучший метод, который не будет использовать много места / памяти с помощью dask?
Ответ №1:
Вы не должны изменять объекты Dask. Вы можете достичь того, чего хотите, используя этот .where
метод. К сожалению, многие находят его формулировку запутанной; но во многих случаях, когда вы хотели бы напрямую использовать pandas для продолжения, вы можете обернуть свой код с map_partition
:
def simple_where(df):
df.loc[df['is_internal'] == 1, 'type'] = 'internal'
df.loc[df['is_internal'] == 0, 'type'] = 'external'
return df
df_out = df_train.map_partitions(simple_where)
Комментарии:
1. я получаю ошибку AttributeError: объект ‘DataFrame’ не имеет атрибута ‘map_partitions’
2. Исправлен вопрос, чтобы показать, как я импортирую данные. Я не понимаю, почему map_partitions недоступен.
3.
df_train=df_train.compute()
— вы только что загрузили все в фрейм данных pandas, что, как мы думали, у вас недостаточно памяти для выполнения.4. Только что понял это. Я не на компьютере, на котором должен будет выполняться скрипт, я работаю на своем рабочем столе.