【问题标题】:Multiply many columns by one column in dask在dask中将多列乘以一列
【发布时间】:2020-10-02 05:03:12
【问题描述】:

我想将大约 50,000 列与大型 dask 数据帧 (6_500_000 x 50_002) 中的另一列相乘。使用 for 循环的解决方案可以工作,但速度非常慢。下面我尝试了另外两种失败的方法。任何建议表示赞赏。

熊猫

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

黎明

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

【问题讨论】:

    标签: pandas dask


    【解决方案1】:

    使用.mul 表示:

    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,但我想这与尝试相同。

      【讨论】:

        猜你喜欢
        • 2020-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 2019-10-18
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        相关资源
        最近更新 更多