如何对含数据簇/邻域的DataFrame按分组单独应用函数
实现方案
电子表格(Excel/WPS表格)实现
逻辑很简单:先通过ROUND函数对Data1取整到百位得到所属簇的中心值,再用SUMIF按簇求和即可,公式直接下拉就能批量生成Result1列。
假设你的数据A列为Data1、B列为Value1,数据从第2行开始,C2单元格输入以下公式:
=SUMIF($A:$A,ROUND(A2,-2),$B:$B)
*公式说明:ROUND(A2,-2)会自动把99/100/101/102归为100簇,199/200/201归为200簇,完全匹配你的示例场景。如果簇的间隔不是100,可以把ROUND换成自定义的if判断逻辑,比如IF(ABS(A2-100)<10,100,200)手动指定邻域阈值。
Python Pandas实现
适合处理大量数据或者簇规则更复杂的场景,两种常用实现逻辑:
已知簇中心的情况
如果提前知道簇的中心是100、200,直接按距离打标签再分组求和:
import pandas as pd # 构造示例数据,实际使用时替换为pd.read_csv()读取你的数据即可 df = pd.DataFrame({ 'Data1': [99,100,101,102,199,200,201], 'Value1': [1,2,3,4,5,6,7] }) # 按距离最近的中心打簇标签 cluster_centers = [100, 200] df['cluster'] = df['Data1'].apply(lambda x: min(cluster_centers, key=lambda c: abs(x - c))) # 按簇分组求和,映射回原表 df['Result1'] = df.groupby('cluster')['Value1'].transform('sum')
未知簇中心的情况
如果只知道簇内相邻点差值小、簇间差值大,自动识别簇分界:
# 先按Data1排序 df = df.sort_values('Data1').reset_index(drop=True) # 相邻Data1差值超过50即判定为新簇,阈值可根据你的数据调整 df['cluster'] = (df['Data1'].diff() > 50).cumsum() # 分组求和 df['Result1'] = df.groupby('cluster')['Value1'].transform('sum')
运行后输出的df就包含你需要的Result1列,结果和示例完全一致。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

