Pandas:如何统计跨多年日期区间的每年战争数量?
优雅解决Pandas中跨年份区间的战争数量统计问题
嗨,这个场景我太熟悉了!用嵌套循环确实又麻烦又低效,Pandas其实有非常简洁的标准方案,核心思路是先把每个战争覆盖的所有年份拆出来,再按年份分组计数,完全不需要手动遍历。我给你一步步演示:
第一步:对齐数据结构(先处理日期类型)
首先要确保你的日期列是datetime类型,我先构造一个样例数据方便演示:
import pandas as pd data = { '战争名称': ['战争A', '战争B', '战争C'], '开始日期': ['2018-03-15', '2019-11-20', '2020-05-01'], '结束日期': ['2020-08-25', '2020-02-10', '2022-12-31'] } df = pd.DataFrame(data) # 务必把日期列转为datetime类型,方便提取年份 df['开始日期'] = pd.to_datetime(df['开始日期']) df['结束日期'] = pd.to_datetime(df['结束日期'])
第二步:生成每个战争覆盖的年份列表
用apply结合range函数,为每一行战争生成它跨越的所有年份(包括开始和结束年份):
df['覆盖年份'] = df.apply( lambda row: list(range(row['开始日期'].year, row['结束日期'].year + 1)), axis=1 )
这一步之后,每个战争条目会对应一个包含所有覆盖年份的列表,比如战争A会生成[2018,2019,2020]。
第三步:展开列表并分组计数
用explode把列表拆成单独的行,然后按年份分组统计数量即可:
# 把年份列表展开为多行,每个年份对应一行原战争数据 yearly_wars = df.explode('覆盖年份') # 按年份分组,统计每组的战争数量 yearly_count = yearly_wars.groupby('覆盖年份')['战争名称'].count().reset_index(name='战争数量')
运行后你会得到这样的结果:
| 覆盖年份 | 战争数量 |
|---|---|
| 2018 | 1 |
| 2019 | 2 |
| 2020 | 3 |
| 2021 | 1 |
| 2022 | 1 |
为什么这个方法更好?
- 完全避免了嵌套循环,利用Pandas的矢量化操作,处理大数据集时效率提升非常明显
- 代码简洁易读,逻辑清晰,后期维护成本低
- 自动处理了各种边界情况:比如战争跨年(12月到次年1月)、持续多年等,都能正确统计到对应的年份
内容的提问来源于stack exchange,提问作者Jasper
相关产品推荐
相关产品推荐

