фильтр столбцов и умножение в фрейме данных dask

#python #python-3.x #pandas #dataframe #dask

#python #python-3.x #pandas #фрейм данных #dask

Вопрос:

Я пытаюсь повторить следующую операцию с фреймом данных dask, где мне нужно отфильтровать фрейм данных на основе значения столбца и умножить на него другой столбец.

Следующее эквивалентно pandas —

 import dask.dataframe as dd

df['adjusted_revenue'] =  0
df.loc[(df.tracked ==1), 'adjusted_revenue'] = 0.7*df['gross_revenue']
df.loc[(df.tracked ==0), 'adjusted_revenue'] = 0.3*df['gross_revenue']
  

Я пытаюсь сделать это в фрейме данных dask, но он не поддерживает назначение.

TypeError: '_LocIndexer' object does not support item assignment

Это работает для меня —

 df['adjusted_revenue'] =  0
df1 = df.loc[df['tracked'] ==1]
df1['adjusted_revenue'] = 0.7*df1['gross_revenue']
df2 = df.loc[df['tracked'] ==0]
df2['adjusted_revenue'] = 0.3*df['gross_revenue']
df = dd.concat([df1, df2])
  

Однако я надеялся, что есть какой-нибудь более простой способ сделать это.

Спасибо!

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

1. Это проблема, специфичная для Dask. Похоже, что изменение данных на месте — не самая простая вещь, которую можно сделать в распределенной вычислительной среде, такой как Dask. github.com/dask/dask/issues/2426

Ответ №1:

Вы должны использовать .apply , что, вероятно, правильно делать и с Pandas; или, возможно where . Однако, чтобы сохранить все как в оригинале, вот оно map_partitions , в котором вы действуете с каждым фрагментом фрейма данных независимо, и эти фрагменты действительно являются фреймами данных Pandas.

 def make_col(df):
    df['adjusted_revenue'] =  0
    df.loc[(df.tracked ==1), 'adjusted_revenue'] = 0.7*df['gross_revenue']
    df.loc[(df.tracked ==0), 'adjusted_revenue'] = 0.3*df['gross_revenue']
    return df

new_df = df.map_partitions(make_col)