You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历Pandas DataFrame计算各州距下次选举年数

问题

现有如下结构的数据集:

|      year     |     state   | election year 1-yes|
|---------------|-------------|--------------------|
|          2010 |     haryana |          1         | 
|          2010 |     haryana |          1         | 
|          2010 |     up      |          0         | 
|          2011 |     goa     |          1         |
|          2012 |     haryana |          0         | 
|          2012 |     up      |          1         | 
|          2013 |     up      |          0         |
|          2013 |     up      |          0         |
|          2013 |     haryana |          1         |
|          2015 |     haryana |          0         |
|          2015 |     up      |          0         |

其中第三列表示对应年份该州是否举办选举(1为是,0为否)。需要编写Pandas代码新增years until next election列,计算每行记录中该州距离下次选举的年数(选举当年值为0)。期望输出如下:

| year |  state | election year 1-yes| years until next election|
|------|--------|--------------------|--------------------------|
| 2010 |haryana |          1         |            0             |
| 2010 |haryana |          1         |            0             |
| 2010 |  up    |          0         |            2             | 
| 2011 | goa    |          1         |            0             | 
| 2012 |haryana |          0         |            3             | 
| 2012 |  up    |          1         |            0             |
| 2013 |  up    |          0         |            4             | 
| 2013 |  up    |          0         |            4             |
| 2013 |haryana |          0         |            2             |
| 2015 |haryana |          1         |            0             |
| 2015 |  up    |          0         |            2             |

数据集包含30余个州、12年的数据,需要实现高效简洁的代码。

解决方案

不用手动遍历循环,直接用Pandas的分组+向量化操作,效率更高,适合大规模数据:

import pandas as pd

# 构造示例DataFrame(实际使用时替换为你的数据源)
data = {
    'year': [2010, 2010, 2010, 2011, 2012, 2012, 2013, 2013, 2013, 2015, 2015],
    'state': ['haryana', 'haryana', 'up', 'goa', 'haryana', 'up', 'up', 'up', 'haryana', 'haryana', 'up'],
    'election year 1-yes': [1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0]
}
df = pd.DataFrame(data)

# 定义分组处理函数
def compute_next_election(group):
    # 按年份排序,保证时间顺序正确
    group_sorted = group.sort_values('year')
    # 提取当前州所有的选举年份
    election_dates = group_sorted[group_sorted['election year 1-yes'] == 1]['year'].tolist()
    # 计算每行距离下次选举的年数
    group_sorted['years until next election'] = group_sorted['year'].apply(
        lambda x: min([y - x for y in election_dates if y >= x], default=0)
    )
    return group_sorted

# 应用分组函数,并保留原数据的行顺序
df = df.groupby('state', group_keys=False).apply(compute_next_election).reset_index(drop=True)

# 输出结果
print(df)

关键逻辑说明

  1. 分组隔离:按state分组,确保每个州的选举年份互不干扰
  2. 排序保障:每组内按年份升序排列,避免时间顺序混乱导致计算错误
  3. 提取选举年份:从每组中筛选出所有举办选举的年份列表
  4. 年数计算:对每行的年份,找到大于等于它的最小选举年份,计算差值;如果当前是选举年,差值直接为0
  5. 保留原序:分组处理后重置索引,恢复原始数据的行顺序

这种方法比手动循环效率高得多,尤其适合处理30+州、12年的大规模数据集。

内容的提问来源于stack exchange,提问作者NoobCoderPy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:55:16