Python 按Numpy中位数分组(不含熊猫)
在不使用pandas(并将我的数据保存在Numpy数组中)的情况下,是否可以基于另一列的分组计算一列的中位数 例如,如果这是输入:Python 按Numpy中位数分组(不含熊猫),python,numpy,group-by,median,Python,Numpy,Group By,Median,在不使用pandas(并将我的数据保存在Numpy数组中)的情况下,是否可以基于另一列的分组计算一列的中位数 例如,如果这是输入: arr = np.array([[0,1],[0,2],[0,3],[1,4],[1,5],[1,6]]) 我想将其作为输出(使用第一列进行分组,然后取第二列的中值: ans = np.array([[0,2],[1,5]]) 如果出于某种原因希望避免使用Pandas,这里有一种计算方法。请注意,在一般情况下,中位数不是整数值(除非将其四舍五入或四舍五入),因为
arr = np.array([[0,1],[0,2],[0,3],[1,4],[1,5],[1,6]])
我想将其作为输出(使用第一列进行分组,然后取第二列的中值:
ans = np.array([[0,2],[1,5]])
如果出于某种原因希望避免使用Pandas,这里有一种计算方法。请注意,在一般情况下,中位数不是整数值(除非将其四舍五入或四舍五入),因为对于偶数大小的组,它将是两个最中间元素的平均值,因此不能在单个常规数组中同时包含整数组id和中值(尽管可以在结构化数组中)
将numpy导入为np
def分组平均值(组,值):
#按组和值排序
s=np.lexsort([值,组])
arr2=arr[s]
组2=组[s]
值2=值[s]
#寻找群体边界
w=np.flatnonzero(np.diff(组2,前置=group2[0]-1,追加=group2[-1]+1))
#每组的大小
wd=np.差异(w)
#每组中点
m1=w[:-1]+wd//2
m2=m1-1+(wd%2)
#组id
组_res=组2[m1]
#组中值
value_res=(value2[m1]+value2[m2])/2#对int结果使用`//2`或四舍五入
返回组\u res,值\u res
#试验
arr=np.数组([[0,1],[0,2],[0,3],[1,4],[1,5],[1,6]]
组分辨率,值分辨率=分组中值(arr[:,0],arr[:,1])
#印刷品
对于zip中的g,v(组,值):
打印(g,v)
# 0 2.0
# 1 5.0
#作为结构化数组
res=np.empty(group_res.shape,dtype=[('group',group_res.dtype),
(“中位数”,值\资源数据类型)])
res['group']=group\U res
res['median']=值
打印(res)
# [(0, 2.) (1, 5.)]
wow好吧,也许我会把它转换成一个数据帧。thanks@lara_toff.这是非常有效的。将它粘贴到某个函数中,然后忘记实现。我会将w=np.where(group[:-1]!=group[1:])[0]
写成w=np.flatnonzero(np.diff(group,prepend=group[0]-1,append=group[-1]+1))
。然后下一行就消失了。好的,我会尝试编辑前面的评论