如何用Pandas提取2015-2020年无重复Total值,缺失年份显示unavailable
搞定Pandas提取指定年份数据的缺失值显示问题
我明白你的痛点:现有代码在2020年数据存在时能正常输出每年唯一的Total值,但一旦2020年数据缺失,整个输出就断了,连后面的2019-2015年数据也出不来,还得处理缺失年份显示unavailable的需求。咱们换个思路来解决这个问题,比原代码更靠谱:
核心思路:先做数据映射,再遍历年份
原代码的问题在于它依赖逐行匹配年份,一旦某一年没找到,就不会触发打印也不会推进计数器,导致后续年份都没法处理。我们可以先把每个年份对应的唯一Total值整理成一个字典,然后直接遍历2020到2015的所有年份,逐个查字典——有值就输出,没值就输出unavailable。
修改后的完整代码
import pandas as pd # 先处理你的DataFrame,得到年份到唯一Total值的映射 # 两种方法二选一,效果一样: # 方法1:去重后转字典 year_total_map = df.drop_duplicates(subset=['Year']).set_index('Year')['Total'].to_dict() # 方法2:按年份分组取第一个值(同一年Total值都重复,取第一个就行) # year_total_map = df.groupby('Year')['Total'].first().to_dict() # 从2020到2015倒序遍历年份 for year in range(2020, 2014, -1): print(year_total_map.get(year, 'unavailable'))
测试两种场景
场景1:有2020年数据的情况
用你给的第一个DataFrame测试,输出会是:
0.66 1.5 unavailable unavailable unavailable unavailable
(因为示例里只有2020和2019的数据,2018-2015都缺失,所以显示unavailable,完全符合要求)
场景2:缺失2020年数据的情况
用第二个DataFrame测试,输出会是:
unavailable 2.00% 7.87% 12.27% 4.67% unavailable
(2020和2015年缺失,显示unavailable,其他年份正常输出唯一值)
为什么这个方案更稳?
- 效率更高:不用遍历DataFrame的每一行,预处理后直接查字典,大数据量下优势明显
- 不会断档:不管哪个年份缺失,都会按顺序输出所有目标年份的结果,不会因为某一年没数据就停住
- 逻辑清晰:把数据整理和年份输出分开,以后要改年份范围或者缺失值显示内容,直接改对应的地方就行
内容的提问来源于stack exchange,提问作者user3702643
相关产品推荐
相关产品推荐

