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)
原代码问题说明
- 重复查询效率低:循环中每次都重复调用
df3.query,多次遍历整个DataFrame,性能差; - 列值为列表的原因:使用
.values会返回数组/列表,赋值给行时会把数组作为单元格值,导致新DataFrame的列类型为列表。上述方案直接筛选原DataFrame的行,单元格值保持单个数据类型,解决了这个问题。
内容的提问来源于stack exchange,提问作者MJAGO
相关产品推荐
相关产品推荐

