我想在超过500,000行的数据框中逐行计算中位数。目前,我正在使用np.median
,因为numpy已优化为可在单个内核上运行。它仍然很慢,我想找到一种并行计算的方法
具体来说,我有N
个大小为13 x 500,000
的表,并且我想为每个表添加列Q1,Q3和中位数,以便中位数列包含每一行的中位数。因此,我必须计算N * 500,000
中位数。
我尝试使用numexpr
,但似乎不可能。
编辑: 实际上,我还需要Q1和Q3,所以我不能使用不允许计算四分位数的统计模块。这是我现在如何计算中位数
q = np.transpose(np.percentile(data[row_array], [25,50,75], axis = 1))
data['Q1_' + family] = q[:,0]
data['MEDIAN_' + family] = q[:,1]
data['Q3_' + family] = q[:,2]
编辑2 我通过使用下面提出的中值算法的中值解决了我的问题
答案 0 :(得分:1)
如果中值的(近似)近似值可以满足您的要求,则应考虑计算中值的中位数,这是可以并行执行的分治策略。原则上, MoM 的串行执行复杂度为O(n)
,在大规模并行系统上的并行执行接近O(1)
。
有关说明和伪代码,请参见this Wiki entry。另请参见this question on Stack Overflow和代码讨论,以及this ArXiv paper的GPU实现。
答案 1 :(得分:0)
@dahhiya_boy的致谢
您可以从median()
模块中使用statistics
import statistics
statistics.median(items)
您可以通过获取median()
和min()
的中值来计算Q1,并且可以通过获取median()
和max()
的中值来计算Q3。如果发现此问题比较混乱,只需定义一个返回Q1,Q2,Q3的quartile_median()
函数即可。
答案 2 :(得分:0)
据我了解,您想逐行计算分位数。
您可以简单地转置数据框,然后应用pandas.DataFrame.quantile
不确定这是否是最佳选择。
q=data.quantile([0.25,0.50,0.75],axis=0)
如果您启用了IPython,则可以使用行魔术符:%time
在行之前检查运行时间。
%time
q=data.quantile([0.25,0.50,0.75],axis=0)
这将向我返回Wall time: 0 ns
。