无需硬编码从Pandas DataFrame提取列子集的方法
如何无需硬编码提取Pandas DataFrame的列子集?
当然有办法啦!不用硬编码列名就能轻松提取1990及以后的列,我给你几个实用的方案,完全适配你给出的df.columns.values结构:
方案1:利用列名的类型筛选
你的年份列是整数类型,而str_ID、num_ID是字符串类型,刚好可以通过类型判断来筛选:
# 先筛选出所有整数类型的列(也就是年份列) year_cols = [col for col in df.columns if isinstance(col, int)] # 提取年份列的子集 df_year_subset = df[year_cols] # 如果需要同时保留ID列和年份列,直接把ID列加进去就行 df_full_subset = df[['str_ID', 'num_ID'] + year_cols]
方案2:基于列的位置切片
既然年份列都排在ID列之后(从第3列开始,索引为2),直接用切片就能快速拿到:
# 提取从索引2开始到最后的所有列(也就是1990及以后的年份列) df_year_subset = df.iloc[:, 2:] # 要是需要保留ID列+年份列,其实就是整个DataFrame啦,不过如果后续列顺序不变,这个方法最简洁
方案3:通过列名的数值大小筛选(通用型)
如果以后年份列可能变成字符串类型(比如'1990'),或者列顺序有变动,这个方法更通用:
# 遍历列名,判断是否为可转换为数字且≥1990的列 year_cols = [col for col in df.columns if str(col).isdigit() and int(col) >= 1990] df_year_subset = df[year_cols]
这个写法用列表推导式简化了判断,不管列名是整数还是数字字符串,都能准确筛选出1990及以后的年份列。
这些方法都不用硬编码具体的年份列名,哪怕以后新增了1996、1997这类列,代码也能自动适配,不用修改~
内容的提问来源于stack exchange,提问作者user308827
相关产品推荐
相关产品推荐

