#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)