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

Pandas提取年末彩票数据列值为列表的简化实现问询

问题

抓取巴西年末(12月31日)高奖金彩票的全部数据并存入DataFrame后,需要提取每年12月31日的数据用于神经网络预测测试。但当前使用的代码不仅重复冗余,生成的新DataFrame各列数据还都是列表形式,需要更简洁的实现方法。原代码如下:

df_mega_virada = pd.DataFrame(columns=['concurso','data', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6'])

datas = ['31/12/2009','31/12/2010','31/12/2011','31/12/2012','31/12/2013','31/12/2014',
         '31/12/2015','31/12/2016','31/12/2017','31/12/2018','31/12/2019','31/12/2020']

for x, y in enumerate(datas):
   df_mega_virada.loc[x] = df3.query(f"data == '{y}'").concurso.values,df3.query(f"data == '{y}'").data.values,df3.query(f"data == '{y}'").b1.values, df3.query(f"data == '{y}'").b2.values,df3.query(f"data == '{y}'").b3.values,df3.query(f"data == '{y}'").b4.values,df3.query(f"data == '{y}'").b5.values,df3.query(f"data == '{y}'").b6.values

简洁实现方案

方案1:自动筛选所有12月31日数据(推荐)

先将日期列转为datetime类型确保筛选准确,再直接提取符合条件的行,无需手动维护日期列表:

# 转换日期列格式(若原data列是字符串格式)
df3['data'] = pd.to_datetime(df3['data'], format='%d/%m/%Y')

# 提取2009-2020年中所有12月31日的数据
df_mega_virada = df3[
    (df3['data'].dt.day == 31) & 
    (df3['data'].dt.month == 12) & 
    (df3['data'].dt.year.between(2009, 2020))
].copy()

# 重置索引(可选,让索引从0开始)
df_mega_virada = df_mega_virada.reset_index(drop=True)

方案2:匹配指定日期列表

如果必须使用你提供的日期列表,直接用isin一次性筛选,避免循环重复查询:

datas = ['31/12/2009','31/12/2010','31/12/2011','31/12/2012','31/12/2013','31/12/2014',
         '31/12/2015','31/12/2016','31/12/2017','31/12/2018','31/12/2019','31/12/2020']

# 一次性筛选所有目标日期的数据
df_mega_virada = df3[df3['data'].isin(datas)].copy()

# 按日期排序并重置索引(可选)
df_mega_virada = df_mega_virada.sort_values('data').reset_index(drop=True)

原代码问题说明

  1. 重复查询效率低:循环中每次都重复调用df3.query,多次遍历整个DataFrame,性能差;
  2. 列值为列表的原因:使用.values会返回数组/列表,赋值给行时会把数组作为单元格值,导致新DataFrame的列类型为列表。上述方案直接筛选原DataFrame的行,单元格值保持单个数据类型,解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:05:15