如何在Pandas中基于部分列名选择从Test到Bio开头列的范围?
解决Pandas中从指定列到特定前缀列的范围选择问题
可行解决方案
直接上适配你需求的代码,针对示例DataFrame:
import pandas as pd df_chunk = pd.DataFrame({ 'Waste':[None,None], 'Test':['something', 'something'], '2':[None,None], '3':[None,None], 'Bio Ref':['2-50','15-100'], 'None':[None,None]}) # 获取Test列的位置索引 test_col_pos = df_chunk.columns.get_loc('Test') # 获取第一个以Bio开头的列的位置索引 bio_col = df_chunk.columns[df_chunk.columns.str.startswith('Bio')][0] bio_col_pos = df_chunk.columns.get_loc(bio_col) # 选择从Test到Bio开头列的完整范围(包含两端) selected_df = df_chunk.iloc[:, test_col_pos : bio_col_pos + 1] print(selected_df)
运行后输出:
Test 2 3 Bio Ref 0 something None None 2-50 1 something None None 15-100
为什么你的原代码失败
你尝试的df_chunk.loc[:, 'Test':df_chunk.columns.str.startswith('Bio')]无法运行,原因是:
loc的列范围语法要求两端是具体列名,或者单独使用布尔数组筛选列,但不能把列名和布尔数组混合使用。df_chunk.columns.str.startswith('Bio')返回的是布尔数组,不是合法的列名,所以和'Test'组合的范围写法不被Pandas识别。
适配场景的扩展处理
针对你提到的场景特点,代码可以灵活调整:
- 如果有多个以Bio开头的列:
若想选到最后一个Bio开头的列,修改获取Bio列的部分:bio_cols = df_chunk.columns[df_chunk.columns.str.startswith('Bio')] bio_col_pos = df_chunk.columns.get_loc(bio_cols[-1]) - 避免Test列在Bio列之后的异常:
加判断防止逻辑错误:if test_col_pos > bio_col_pos: print("Test列位置在Bio列之后,无法选择有效范围") else: selected_df = df_chunk.iloc[:, test_col_pos : bio_col_pos + 1] - 用列名列表直接选择:
若更习惯列名操作,可先拿到目标列名称列表再选择:target_cols = df_chunk.columns[test_col_pos : bio_col_pos + 1] selected_df = df_chunk[target_cols]
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

