sch*_*_90 2 python group-by dataframe pandas dask
我有一个非常大的数据框,正在使用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
Run Code Online (Sandbox Code Playgroud)
但它有数百万行。
我在代码的这一点上想做的是计算中形成的每个组之间的Jaccard 距离Bool_1和。这是因为该程序的目的是为其中存在的每个组生成一行(每行都有多个统计数据,我仅报告相关列)。Bool_2Col_2Col_2
为此,我首先Col_2使用来对数据帧进行分组df.groupby("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之间的 J 距离,但它会产生奇怪的结果(即使没有交集,每个组也会返回 J=1)。Bool_1Bool_2
3:我尝试compute()使用数据框并迭代组:
for name, group in df.groupby("Col_2"):
jacc = dask_distance.jaccard(group["Bool_1"], group["Bool_2"])
Run Code Online (Sandbox Code Playgroud)
但是这个速度慢得要命,因为它触发计算,然后逐组对如此巨大的数据帧进行操作(即我不想使用它)。作为参考,具有此功能的脚本已经运行了两天,而我估计我尝试过的任何解决方案 #1 和 #2,如果设置正确,将在 1-2 小时内返回结果。
关于我如何处理这个问题有什么建议吗?我理想的解决方案是以df.groupby("Col_1").apply(compute_jacc_dist)正确的方式使用。非常感谢任何帮助!
经过几个小时的尝试,我是这样做的。如果您正在阅读本文,您可能想阅读这篇文章(How to apply euclidean distance function to a groupby object in pandas dataframe?)和这篇文章(Apply multiple function to multiple groupby columns)。
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()
Run Code Online (Sandbox Code Playgroud)
解释
我创建了一个函数来计算数据帧两列之间的杰卡德距离。在该函数中,我创建了一个字典 ( d),其中将包含我的计算结果。
拥有一本字典的好处是我可以添加任意数量的计算,尽管这里只有一个。
然后该函数返回一个pd.Series包含该字典的字典。
该函数应用于基于 的数据帧组Col_2。meta数据类型在 中指定apply(),并且整个内容compute()在最后,因为它是一个 dask 数据帧,并且必须触发计算才能获得结果。
应apply()具有meta与输出列一样多的数量。
| 归档时间: |
|
| 查看次数: |
2861 次 |
| 最近记录: |