如何用Pandas找出各数据记录器湿度/温度最高值的年份并统计数量
问题分析
你的代码逻辑错误在于,groupby('logger')['year', trait].max()会分别对year和trait列取最大值——这两个最大值并不一定来自同一条记录(比如某个记录器的最晚年份是1995,但它的最高湿度可能出现在1990年),因此无法正确定位每个记录器对应特征最高值的年份。
正确实现步骤
- 对每个记录器,找出其平均湿度/温度最高的所有年份(支持并列最高的场景)
- 统计每个年份被多少个记录器列为最高特征值的年份
- 将统计结果合并到目标年份DataFrame中
完整代码
import pandas as pd # 假设原DataFrame结构为:logger, year, avg_humidity, avg_temp # 1. 统计各年份成为最高平均湿度的记录器数量 max_humidity = df.groupby('logger')['avg_humidity'].transform('max') humidity_top_rows = df[df['avg_humidity'] == max_humidity] humidity_count = humidity_top_rows.groupby('year')['logger'].nunique().reset_index( name='count_avg_humidity' ) # 2. 统计各年份成为最高平均温度的记录器数量,逻辑同上 max_temp = df.groupby('logger')['avg_temp'].transform('max') temp_top_rows = df[df['avg_temp'] == max_temp] temp_count = temp_top_rows.groupby('year')['logger'].nunique().reset_index( name='count_avg_temp' ) # 3. 合并到目标年份DataFrame df_years = pd.DataFrame({'year': list(range(1985, 1996))}) final_df = df_years.merge(humidity_count, on='year', how='left') \ .merge(temp_count, on='year', how='left') \ .fillna(0) # 可选:将浮点类型的计数转为整数 final_df[['count_avg_humidity', 'count_avg_temp']] = final_df[['count_avg_humidity', 'count_avg_temp']].astype(int) print(final_df)
代码说明
transform('max'):为每个记录器的每一行添加该记录器对应的最高特征值,方便后续筛选符合条件的年份nunique():确保同一个记录器如果在多个年份并列最高,每个年份都会被统计一次,但同一年份下同一个记录器不会重复计数fillna(0):处理没有记录器将该年份列为最高值的情况,用0填充缺失值
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

