【问题标题】:Dask Dataframe groupby and aggregate for columnDask Dataframe groupby 和聚合列
【发布时间】:2021-02-04 20:19:33
【问题描述】:

我有一个 pd.DataFrame,我将其转换为 Dask.DataFrame 以加快计算速度。 我的要求是我必须找出频道的“总观看次数”。

在 pandas 中应该是 df.groupby(['ChannelTitle'])['VideoViewCount'].sum(),但在 dask 中,dtypes 列是 object 和 groupby 将这些作为字符串而不是 int(参见图 2)

为了处理上述问题,我添加了两列分隔图(115)和乘数(6 表示 M,3 表示 K)的视图希望执行类似 ddf['new_views_f'] * (10**ddf['new_views_m']) 的操作,但现在我找不到 mul 两个dask 中的列。

要么我遗漏了什么,要么使要求复杂化。

【问题讨论】:

    标签: pandas-groupby grouping dask multiplication dask-dataframe


    【解决方案1】:

    听起来您确实使要求复杂化了。对于列乘法,常规的 pandas 语法将起作用 (df['c'] = df['a'] * df['b'])。在您的情况下,可以使用 pd.eval 获取视图的实际数值:

    import pandas as pd
    import numpy as np
    import dask.dataframe as dd
    import random
    
    df = pd.DataFrame(15*np.random.rand(15), columns=['views'])
    df['views'] = df['views'].round(2).astype('str') + [random.choice(['K views', 'M views']) for _ in range(len(df))]
    df['group'] = [random.choice([1,2,3]) for _ in range(len(df))]
    ddf = dd.from_pandas(df, npartitions=2)
    
    ddf['views_digits'] = ddf['views'].replace({'K views': '*1e3', 'M views': '*1e6'}, regex=True).map(pd.eval, meta=ddf['group'])
    aggregate_df = ddf.groupby(['group']).agg({'views_digits': 'sum'}).compute()
    

    【讨论】:

    • 但我需要的是您在 df(第 8 行和第 9 行)上执行的操作,也在 ddf 上执行。
    • 是的,它们是在ddf 上执行的,前几行中的pandas 只是为了提供可重现的示例。您可以删除这些行并将其替换为 ddf = dd.read_csv() 或以另一种方式创建 ddf 的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2018-04-07
    • 2017-10-04
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多