我有一个非常大的数据帧,我正在用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
但它有数百万行
在代码的这一点上,我试图为在Col_2
中形成的每个组计算Bool_1
和Bool_2
之间的Jaccard距离。这是因为该程序的目的是为Col_2
中存在的每个组生成一行(每行有几个统计数据,我只报告相关列)
为此,我首先使用df.groupby("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_1
和Bool_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)
。非常感谢任何帮助
经过几个小时的尝试,以下是我是如何做到的。如果你正在读这个,你可能想读这个(How to apply euclidean distance function to a groupby object in pandas dataframe?)和这个(Apply multiple functions to multiple groupby columns)
解释
我创建了一个函数,用于计算数据帧的两列之间的Jaccard距离。在函数中,我创建了一个字典(
d
),它将包含我的计算结果拥有字典的好处是,我可以添加任意多的计算,尽管这里只有一个
然后,该函数返回一个包含字典的
pd.Series
该函数应用于基于
Col_2
的数据帧组meta
数据类型是在apply()
中指定的,整个过程的结尾是compute()
,因为它是一个dask数据帧,必须触发计算才能得到结果apply()
的meta
应与输出列的数量相同相关问题 更多 >
编程相关推荐