在R语言数据框中统计各站点极值记录年份次数的方法
解决方案:统计各站点气候指标年度极值的出现次数
没问题,我来帮你搞定这个统计需求!下面是基于Python Pandas的完整解决方案,一步步拆解操作:
一、先明确处理思路
我们需要先把原始数据整理成整洁的长格式(每行对应「站点-年份-三个气候指标」的组合),然后针对每个指标:
- 找到每年该指标的极值(最高均温取最大值、最低均温取最小值、总降水量取最大值)对应的站点
- 最后统计每个站点拿到各指标年度极值的次数
二、代码实现(含模拟数据)
1. 模拟你的原始数据
先模拟一个和你描述结构一致的数据集,方便你对照修改:
import pandas as pd # 模拟原始数据:St_name是站点名,Met_data是该站点所有年份的气候数据字符串 data = { "St_name": ["station1", "station2", "station3"], "Met_data": [ "1985 15.33 4.33 780.1, 1986 12.5 3.8 650.2, 1987 16.1 5.2 820.5", "1985 14.8 3.9 750.3, 1986 13.2 4.1 680.7, 1987 15.8 4.9 800.1", "1985 15.5 4.1 790.5, 1986 12.8 3.7 660.3, 1987 16.0 5.0 810.2" ] } df = pd.DataFrame(data)
2. 数据整理:把字符串格式的气象数据拆分成结构化数据
这一步是关键,把每个站点的年度数据拆分成单独行,并提取年份和三个指标:
# 1. 把每个站点的年度数据字符串拆分成单独的年度记录行 df_expanded = df.assign(Met_data=df['Met_data'].str.split(', ')).explode('Met_data') # 2. 把每个年度记录拆分成「年份、最高均温、最低均温、总降水量」四列 df_expanded[['Year', 'Max_Avg_Temp', 'Min_Avg_Temp', 'Total_Precip']] = df_expanded['Met_data'].str.split(' ', expand=True) # 3. 转换数据类型(字符串转数字,方便后续计算) df_clean = df_expanded.astype({ 'Year': int, 'Max_Avg_Temp': float, 'Min_Avg_Temp': float, 'Total_Precip': float }).drop('Met_data', axis=1) # 删掉没用的Met_data列
整理后的df_clean就是整洁的结构化数据,示例如下:
| St_name | Year | Max_Avg_Temp | Min_Avg_Temp | Total_Precip |
|---|---|---|---|---|
| station1 | 1985 | 15.33 | 4.33 | 780.1 |
| station1 | 1986 | 12.5 | 3.8 | 650.2 |
| ... | ... | ... | ... | ... |
3. 统计各站点的极值次数
情况1:仅统计每年第一个出现极值的站点(默认逻辑)
# 1. 找出每年各指标的极值对应的站点 max_temp_winners = df_clean.loc[df_clean.groupby('Year')['Max_Avg_Temp'].idxmax()] min_temp_winners = df_clean.loc[df_clean.groupby('Year')['Min_Avg_Temp'].idxmin()] precip_winners = df_clean.loc[df_clean.groupby('Year')['Total_Precip'].idxmax()] # 2. 统计每个站点拿到各指标极值的次数 result = pd.DataFrame({ '最高平均气温次数': max_temp_winners['St_name'].value_counts(), '最低平均气温次数': min_temp_winners['St_name'].value_counts(), '最高总降水量次数': precip_winners['St_name'].value_counts() }).fillna(0).astype(int) # 把未拿到极值的站点次数补为0
情况2:处理同一年多个站点并列极值的情况(比如两个站点当年最高均温相同)
如果需要把并列的站点都统计进去,用transform标记极值行:
# 标记每个站点是否是当年该指标的极值 df_clean['is_max_temp'] = df_clean.groupby('Year')['Max_Avg_Temp'].transform(lambda x: x == x.max()) df_clean['is_min_temp'] = df_clean.groupby('Year')['Min_Avg_Temp'].transform(lambda x: x == x.min()) df_clean['is_max_precip'] = df_clean.groupby('Year')['Total_Precip'].transform(lambda x: x == x.max()) # 筛选出所有极值站点 max_temp_winners = df_clean[df_clean['is_max_temp']] min_temp_winners = df_clean[df_clean['is_min_temp']] precip_winners = df_clean[df_clean['is_max_precip']] # 统计次数(逻辑同上) result = pd.DataFrame({ '最高平均气温次数': max_temp_winners['St_name'].value_counts(), '最低平均气温次数': min_temp_winners['St_name'].value_counts(), '最高总降水量次数': precip_winners['St_name'].value_counts() }).fillna(0).astype(int)
4. 查看最终结果
运行print(result)就能得到每个站点的统计次数,示例输出:
| St_name | 最高平均气温次数 | 最低平均气温次数 | 最高总降水量次数 |
|---|---|---|---|
| station3 | 2 | 1 | 2 |
| station1 | 1 | 2 | 1 |
| station2 | 0 | 0 | 0 |
三、适配不同数据结构的提示
如果你的原始数据已经是每行对应站点-年份-三个指标的整洁格式(不需要拆分字符串),可以直接跳过「数据整理」步骤,从「统计极值次数」部分开始操作。
内容的提问来源于stack exchange,提问作者DinuJ
相关产品推荐
相关产品推荐

