繁体   English   中英

如何将自定义函数应用于 dask 数据框中的组,使用多列作为函数输入

[英]How to apply a custom function to groups in a dask dataframe, using multiple columns as function input

我有一个非常大的数据,我正在处理dask 数据框看起来大体是这样的:

Col_1    Col_2   Bool_1   Bool_2
A        1       True     False
B        1       True     True
C        1       False    False
D        1       True     False
A        2       False    True
B        2       False    False
C        2       True     False
D        2       True     True

但它有数百万行。

我试图在这一点上的代码做的是计算之间的距离捷卡Bool_1Bool_2为形成在每个组Col_2 这是因为该程序的目的是为Col_2存在的每个组生成一行(每行都有几个统计信息,我只报告相关列)。

为此,我首先使用df.groupby("Col_2")Col_2对数据帧进行Col_2 ,但随后我不知道如何继续。 到目前为止,我尝试的每一次尝试都引发了错误。

1 :我尝试定义一个函数compute_jacc_dist()并通过apply(compute_jacc_dist, axis=1)将其传递给组,但它在 args 和 kwargs 方面存在问题(尤其是轴,请参阅https://github.com /dask/dask/issues/1572 ,我还没有解决)。

2 :我尝试使用from dask_distance import jaccard并使用它来计算Bool_1Bool_2之间的 J 距离,但它产生了奇怪的结果(即使没有交集,每组返回 J=1)。

3 :我尝试compute()数据帧并使用以下方法迭代组:

for name, group in df.groupby("Col_2"):
   jacc = dask_distance.jaccard(group["Bool_1"], group["Bool_2"])

但是这个速度很慢,因为它会触发计算,然后逐组对如此庞大的数据帧进行操作(即我不想使用它)。 作为参考,具有此功能的脚本已运行两天,而我估计我尝试过的任何解决方案 #1 和 #2,如果设置正确,将在 1-2 小时内返回结果。

关于我如何处理这个问题的任何建议? 我的理想解决方案是以适当的方式使用df.groupby("Col_1").apply(compute_jacc_dist) 非常感谢任何帮助!

经过几个小时的尝试,这就是我做到的。 如果您正在阅读本文,您可能想阅读本文( 如何将欧几里得距离函数应用于熊猫数据框中的 groupby 对象? )和此( 将多个函数应用于多个 groupby 列)。

def my_function(x):

    d = {}
    v1 = np.array(x["Bool_1"])
    v2 = np.array(x["Bool_2"])
    intersection = np.logical_and(v1, v2).sum()
    union = np.logical_or(v1, v2).sum()
    d["Jaccard"] = float(intersection) / float(union)
    return pd.Series(d, index=["Jaccard"])

df = df.groupby("Col_2").apply(my_function, meta={"Jaccard":"float16"}).compute()

解释

我创建了一个函数来计算我的数据帧的两列之间的 Jaccard 距离。 在该函数中,我创建了一个字典 ( d ),其中将包含我的计算结果。

拥有字典的好处是我可以添加任意数量的计算,尽管这里只有一个。

然后该函数返回一个包含字典的pd.Series

该函数应用于基于Col_2的数据帧组。 meta数据类型在apply()中指定,整个事情最后都有compute() ,因为它是一个 dask 数据帧,必须触发计算才能获得结果。

apply()应该有与输出列一样多的meta

暂无
暂无

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

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