如何按season(年份)统计DataFrame中各年份的风暴记录行数?
问题分析与解决方案
你原来的代码返回0的核心原因:DataFrame里season列是数值类型(如int),但你用字符串"1970"做匹配,类型不相等导致筛选不到任何数据。
以下是几种高效的解决方法:
方法1:用value_counts()(最简洁)
value_counts()可直接统计每个年份的出现次数,按年份排序后输出即可:
# 统计并按年份升序排列 year_counts = storms['season'].value_counts().sort_index() # 遍历输出到2020年 for year, count in year_counts.items(): if year <= 2020: print(f'Number of storms in {year} : {count}')
方法2:用groupby()分组统计
适合需要后续扩展分组操作的场景:
# 按season分组后统计每组行数,再排序 year_counts = storms.groupby('season').size().sort_index() # 输出结果 for year, count in year_counts.items(): if year <= 2020: print(f'Number of storms in {year} : {count}')
修复你原有代码的方案
如果要保留原有思路,只需统一匹配的类型:
# 方案1:用数值1970匹配(推荐,因为season是数值类型) storms_1970_filter = storms.apply(lambda x: x['season'] == 1970, axis=1) # 方案2:将season转为字符串后匹配 storms_1970_filter = storms.apply(lambda x: str(x['season']) == "1970", axis=1) storms_1970 = len(storms_1970_filter[storms_1970_filter].index) print('Number of storms in 1970 :', storms_1970)
注意:这种逐行apply的方式效率远低于前两种,不适合处理大数据量。
输出示例
运行后会得到你期望的格式:
Number of storms in 1970 : 10 Number of storms in 1971 : 14 Number of storms in 1972 : 11 ... Number of storms in 2020 : X
内容的提问来源于stack exchange,提问作者MateaMar
相关产品推荐
相关产品推荐

