Python Pandas如何筛选同时含1970与2016年数据的州对应行
解决方法
你需要先识别出同时满足「存在1970年记录」「存在2016年记录」两个条件的州,再基于这些州过滤全表即可。原代码只做了行级的年份范围筛选,没有做按州的聚合校验,所以达不到要求。
方法1:集合交集法(性能最优,逻辑直白)
直接分别取出有1970年记录的州、有2016年记录的州,取两者的交集就是符合要求的州,再过滤原表:
# 提取两个年份分别对应的州集合 states_has_1970 = set(df[df['year'] == 1970]['state']) states_has_2016 = set(df[df['year'] == 2016]['state']) # 取交集得到同时有两年数据的州 valid_states = states_has_1970 & states_has_2016 # 过滤原表,保留这些州的所有行 result = df[df['state'].isin(valid_states)]
方法2:分组判断法(适合扩展多条件场景)
如果后续需要扩展判断更多年份(比如要求同时有1970/1990/2016三年数据),用分组判断的写法更方便扩展:
# 按州分组,检查每个州的年份集合是否包含要求的两个年份 valid_states = df.groupby('state')['year'].apply( lambda year_col: {1970, 2016}.issubset(set(year_col)) ) # 提取符合条件的州,过滤原表 result = df[df['state'].isin(valid_states[valid_states].index)]
示例数据运行结果
用你给出的测试数据运行后,仅Wisconsin同时存在1970和2016年的记录,最终返回结果如下:
state year quarter v 5 Wisconsin 2016 4 0.168776 6 Wisconsin 1970 4 0.168776
内容的提问来源于stack exchange,提问作者kiyis_stats
相关产品推荐
相关产品推荐

