如何基于滑块选择的月份在Pandas DataFrame中筛选固定6行数据
基于选中月份筛选连续6行Pandas数据
问题场景
现有包含function、service、month三列的Pandas DataFrame,月份覆盖1-12月。通过滑块选择一个月份(对应变量var),需要筛选出始终包含该选中月份的6行连续数据,选中月份可位于结果的开头、中间或末尾。
用户提供的DataFrame构造代码:
import pandas as pd data = { "function": ["test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","test11","test12"], "service": ["A", "B", "AO", "M" ,"A", "PO", "MP", "YU", "Z", "R", "E", "YU"], "month": ["January","February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] } df = pd.DataFrame(data)
DataFrame示例输出:
function service month 0 test1 A January 1 test2 B February 2 test3 AO March 3 test4 M April 4 test5 A May 5 test6 PO June 6 test7 MP July 7 test8 YU August 8 test9 Z September 9 test10 R October 10 test11 E November 11 test12 YU December
用户尝试的无效代码:
def selectDataRange(var:str,df): if var=="January": df.iloc[0: 6,] if var=="February": df.iloc[1: 6,] if var=="March": df.iloc[2: 6,]
问题分析
上述无效代码存在三个核心问题:
- 函数无
return语句,执行后不会返回筛选结果; - 切片逻辑错误,例如选中February时,
iloc[1:6]仅返回5行,不符合6行的要求; - 未处理选中月份靠近DataFrame末尾的情况,会导致切片长度不足或索引越界。
解决方案
通过定位目标月份索引→计算合法切片范围→返回结果的逻辑实现需求,确保始终返回包含目标月份的6行数据:
def selectDataRange(var: str, df): # 获取选中月份对应的行索引 target_idx = df[df['month'] == var].index[0] # 初始计算起始索引,优先让目标月份处于结果中间位置 start = max(0, target_idx - 2) end = start + 6 # 若结束索引超出DataFrame长度,调整为从末尾向前取6行 if end > len(df): end = len(df) start = end - 6 # 返回切片后的结果 return df.iloc[start:end]
逻辑说明
- 定位索引:通过
df[df['month'] == var].index[0]精准获取选中月份对应的行索引; - 计算切片范围:
- 优先让目标月份处于结果的中间位置(向前取2行,向后取3行);
- 若起始索引小于0,则从第0行开始;
- 若结束索引超出DataFrame总长度,则从末尾向前取6行,保证结果始终为6行;
- 返回结果:通过
iloc切片返回最终筛选数据。
测试示例
- 选中
January(索引0):返回0-5行,包含目标月份; - 选中
April(索引3):返回1-6行,目标月份处于结果中间; - 选中
December(索引11):返回6-11行,目标月份处于结果末尾。
内容的提问来源于stack exchange,提问作者user29295031
相关产品推荐
相关产品推荐

