#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, но я полагаю, что это та же проблема для этой попытки.