我想知道如何创建按其差异 <=4 分组的项目类,因此 1,2,3,4,5 将被分组为 1, 9-13 到 9 ... 然后选择最小/最大值属性 y,以一种高效/简单的方式:
items= [('x', [ 1,2,3,3,3,5,9,10,11,13]), ('y', [1,1,1,1,1,4,4,1,1,1])]
In[3]: pd.DataFrame.from_items(items) Out[3]: x y 0 1 1 1 2 1 2 3 1 3 3 1 4 3 1 5 5 4 6 9 5 7 10 1 8 11 1 9 13 1
所以我期望的结果是:
xclass ymax ymin 1 4 1 9 5 1
我在没有大熊猫的情况下进行了迭代,但我想用大熊猫测试性能。
此类操作通常分两步完成:
我假设您已将数据框df
定义为
df = pd.DataFrame.from_items([('x', [ 1,2,3,3,3,5,9,10,11,13]),
('y', [1,1,1,1,1,4,4,1,1,1])])
在您的问题中,第一步没有很好地定义。如果数据密集,如何在组之间绘制边界?例如,如果您有 ,您想对组做df['x'] = [ 1,2,3,3,5,7,9,10,11,13]
什么?
最简单的想法是四舍五入x
到您想要的精度。这确保组中任何整数之间的距离不超过 4。 但是组将被放置而没有间隙:1-5 到 5、6-10 到 10、11-15 到 15 等。
def custom_round(x, precision, offset):
return ((x-offset) // precision) * precision + offset
df['xclass'] = custom_round(df['x'], 5, 1)
另一个想法是拥有足够密集的组:如果两个组之间的最小距离小于阈值,则可以合并两个组。这种算法可以产生由大于阈值的间隙划分的大组。它可以用 DBSCAN 聚类算法来实现。要拥有您想要的组,您可以将阈值距离设置为 3(因为 5 和 9 之间的距离已经是 4):
from sklearn.cluster import DBSCAN
def cluster(x, threshold):
labels = DBSCAN(eps=3, min_samples=1).fit(np.array(x)[:, np.newaxis]).labels_
return x.groupby(labels).transform(min)
df['xclass'] = cluster(df['x'], 3)
第二步很简单:拥有df
包含列xclass
和的数据框y
,调用:
df.groupby('xclass')['y'].aggregate([min, max]).reset_index()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句