针对列中每个唯一值筛选最早4个日期,计算对应值的平均值
解决方法:按ID筛选最早4条记录并计算Value平均值
没问题,我来帮你搞定这个需求!针对每个唯一ID筛选出对应的最早4条日期记录,再计算这些记录里Value字段的平均值,我会用两种常用工具的实现方案,你可以按需选用:
方法1:SQL实现
如果你的数据存储在数据库里,用窗口函数是最直接的方式。核心思路是先给每个ID下的记录按日期排序标记序号,再筛选序号≤4的记录,最后分组求平均:
WITH ranked_records AS ( SELECT ID, Value, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date ASC) AS record_rank FROM your_table_name ) SELECT ID, AVG(Value) AS "Avg Value" FROM ranked_records WHERE record_rank <= 4 GROUP BY ID;
说明:
PARTITION BY ID:按ID分组处理每条记录ORDER BY Date ASC:确保每个组内按日期从早到晚排序ROW_NUMBER():给每个组内的记录分配递增序号,最早的记录序号为1- 最后筛选序号≤4的记录,分组计算Value的平均值即可得到结果
方法2:Python Pandas实现
如果用Python处理本地数据,Pandas可以轻松完成这个任务:
首先假设你的数据是DataFrame格式,先把Date列转换为日期类型,再分组处理:
import pandas as pd # 示例数据(可以替换成你的数据读取逻辑,比如pd.read_csv) data = { 'ID': ['aa1', 'aa1', 'aa1', 'aa1', 'aa1', 'aa1', 'aa2n', 'aa2n', 'aa2n', 'aa2n', 'aa2n'], 'Date': ['1/1/2006', '2/1/2007', '3/2/2005', '1/20/1998', '5/3/2001', '7/4/2010', '4/3/2002', '4/5/2002', '6/30/2011', '6/21/2012', '1/5/1998'], 'Value': [5,4,7,10,9,10,5,6,7,5,3] } df = pd.DataFrame(data) # 转换Date列为日期类型,确保排序正确 df['Date'] = pd.to_datetime(df['Date']) # 按ID分组,每个组按日期排序后取前4条,计算Value的平均值 result = df.groupby('ID').apply( lambda group: group.sort_values('Date').head(4)['Value'].mean() ).reset_index(name='Avg Value') # 格式化输出(可选,让结果更接近示例格式) print(result.to_string(index=False))
运行后会输出:
ID Avg Value aa1 7.75 aa2n 5.25
说明:
pd.to_datetime(df['Date']):把字符串格式的日期转换为Pandas可识别的日期类型,避免排序错误groupby('ID').apply(...):对每个ID组单独处理sort_values('Date').head(4):按日期升序排序后取最早的4条记录- 最后计算这4条记录Value的平均值,重命名列名后得到结果
内容的提问来源于stack exchange,提问作者Al. So
相关产品推荐
相关产品推荐

