繁体   English   中英

在 Dask dataframe 中查找多列的中值

[英]Find median value across multiple columns in a Dask dataframe

我有一个 Dask dataframe,它有三列,宽度、高度和长度。 我需要创建第四列,这是三列的中位数。

我的常规 pandas df 代码不起作用,因为中位数不是 Dask 中的 function。

columns_to_sum = ['weight', 'height', 'length']
df['median'] = df[columns_to_sum].median(axis=1)

任何帮助表示赞赏!

因为中位数是所有值的有序集中的中间值,所以对于大于内存的数据结构,这很慢且难以实现。

Dask 的dask.DataFrame.quantile使用多种算法实现生成近似分位数的算法:

df['median'] = df[columns_to_sum].quantile(0.5)

但是,正如@quasiben 指出的那样, df[columns_to_sum].mean()甚至比这些近似算法更有效。 此外,一些算法存在突出问题,这表明dask.DataFrame.quantile在某些边缘情况下逼近真实分位数的工作非常糟糕。 他们正在努力

虽然平行中位数确实很难,但在这种情况下,提问者询问的是跨列的中位数。 这很容易,因为对于每一行,我们已经在 memory 中拥有所有数据。

如果这尚不存在,则应将其添加到 Dask Dataframe。 如果您想在https://github.com/dask/dask/issues/new提出问题,那将是受欢迎的。

作为短期解决方法,您始终可以使用 Pandas 函数和 map_partitions

def f(df: pandas.DataFrame, columns: list) -> pandas.DataFrame:
    df = df.copy()  # dask prefers that you not mutate inputs
    df["median"] = df[columns].median(axis=1)

ddf = ddf.map_partitions(f, columns=["a", "b", "c"])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM