如何根据Pandas中的部分列名选择列范围?

问题描述 投票:0回答:2

我有 pandas 数据框,我正在尝试 选择多个列列范围

Test
Bio Ref
)。选择必须从 Test
start
到名称以
Bio
开头的任何列。以下是示例数据框。

实际上它可以包含:

  1. Test
    列之前的任意数量的列,
  2. Test
    Bio Ref
    之间的任意数量的列,如 2、3、4、5 等。
  3. Bio Ref
    之后的任意数量的列。
  4. 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')]
python pandas dataframe
2个回答
1
投票

您可以为布尔索引创建掩码:

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

0
投票

使用标准库中的

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
© www.soinside.com 2019 - 2024. All rights reserved.