Столбец обновления Dask похож на случай sql

#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. Только что понял это. Я не на компьютере, на котором должен будет выполняться скрипт, я работаю на своем рабочем столе.