我有 pandas 数据框,我正在尝试 选择多个列(列范围从
Test
到 Bio Ref
)。选择必须从 Test
列 start到名称以
Bio
开头的任何列。以下是示例数据框。
实际上它可以包含:
Test
列之前的任意数量的列,Test
和 Bio Ref
之间的任意数量的列,如 2、3、4、5 等。Bio Ref
之后的任意数量的列。Bio Ref
列可以包含后缀,但 Bio Ref
将始终作为列名称的开头。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]})
df_chunk
Waste Test 2 3 Bio Ref None
0 None something None None 2-50 None
1 None something None None 15-100 None
我已经尝试过以下有效的代码:
df_chunk.columns.str.startswith('Bio')
df_chunk[df_chunk.columns[pd.Series(df_chunk.columns).str.startswith('Bio')==1]]
问题:但是当我尝试使用它们进行多列选择时,它不起作用:
df_chunk.loc[:, 'Test':df_chunk.columns.str.startswith('Bio')]
您可以为布尔索引创建掩码:
m1 = np.maximum.accumulate(df_chunk.columns=='Test')
# array([False, True, True, True, True, True])
m2 = np.maximum.accumulate(df_chunk.columns.str.startswith('Bio')[::-1])[::-1]
# array([ True, True, True, True, True, False])
# m1 & m2
# array([False, True, True, True, True, False])
out = df_chunk.loc[:, (m1&m2)]
或者确定正确的名称来构建切片:
start = 'Test'
end = next(iter(df_chunk.columns[df_chunk.columns.str.startswith('Bio')]), None)
out = df_chunk.loc[:, slice(start, end)]
输出:
Test 2 3 Bio Ref
0 something None None 2-50
1 something None None 15-100
re.match
re
,如下所示:
import re
import pandas as pd
idxs = [i for i, el in enumerate(df_chunk.columns) if el == 'Test' or re.match(r'^Bio', el)]
df_subset = df_chunk[ df_chunk.columns[ idxs[0] : (idxs[1]+1) ] ]
输出:
Test 2 3 Bio Ref
0 something None None 2-50
1 something None None 15-100