Умножьте много столбцов на один столбец в dask

#pandas #dask

#pandas #dask

Вопрос:

Я хочу умножить примерно 50 000 столбцов на один другой столбец в большом dask dataframe ( 6_500_000 x 50_002 ). Решение, использующее цикл for, работает, но мучительно медленно. Ниже я попробовал две другие оценки, которые не увенчались успехом. Приветствуются любые советы.

Pandas

 import pandas as pd
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
df[['a','b']].multiply(df['c'], axis="index")
  

Dask

 import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=1)

# works but very slow for large datasets: 
for column in ['a', 'b']:
    ddf[column] = ddf[column] * ddf['c']

# don't work:
ddf[['a','b']].multiply(ddf['c'], axis="index") 
ddf[['a', 'b']].map_partitions(pd.DataFrame.mul, other=ddf['c'] ).compute()
  

Ответ №1:

Использовать .mul для dask:

 import pandas as pd
import dask.dataframe as dd
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
ddf = dd.from_pandas(df, npartitions=1)

ddf[['a','b']] = ddf[['a','b']].mul(ddf['c'], axis='index') # or axis=0

ddf.compute()
Out[1]: 
    a   b  c
0   7  28  7
1  16  40  8
2  27  54  9
  

Ответ №2:

У вас в основном было это для pandas, просто multiply() не на месте. Я также перешел на использование .loc для всех столбцов, кроме одного, чтобы вы не вводили 50 000 имен столбцов 🙂

 import pandas as pd
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
df.loc[:, df.columns != 'c']=df.loc[:, df.columns != 'c'].multiply(df['c'], axis="index")
  

Вывод:

     a   b  c
0   7  28  7
1  16  40  8
2  27  54  9
  

ПРИМЕЧАНИЕ: я не знаком с Dask, но я полагаю, что это та же проблема для этой попытки.