

下記のdataframeに対して  
「labelが1かつ列名にP1を含む列の値が1以上かつ列名にP3を含む列の値が1以上の要素を抽出」  
という処理を加えたいです。

Pythonコードの例をご教示頂けますでしょうか。

dataframe  
[![Input
data](https://i.stack.imgur.com/ZbDaf.png)](https://i.stack.imgur.com/ZbDaf.png)  
↓  
↓  
Output data  
(labelが0のもの以外にも、列名にP1とP3を含む列の値が全て0のものも抽出していない)  
[![画像の説明をここに入力](https://i.stack.imgur.com/epZvG.png)](https://i.stack.imgur.com/epZvG.png)


CC BY-SA 4.0
2020-04-16T14:01:03.687
65688
2020-04-17T00:49:47.580
39424
question
python pandas
pandas dataframeの列名に〇〇を含む要素を抽出しさらに値にフィルターをかける方法


「列名に **P1** を含む列」は `df.columns.str.contains('P1')` なので、「列名に **P1**
を含む列の値が（１つでも）1以上の行」 は `(df.loc[:, df.columns.str.contains('P1')] >=
1).any(axis=1)` となります。

<https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.str.contains.html>  
<https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.any.html>

ということで、「 **label** が1かつ列名に **P1** を含む列の値が（１つでも）1以上かつ列名に **P3**
を含む列の値が（１つでも）1以上の要素を抽出」は

[code]

    df[(df.loc[:,'label'] == 1) & (df.loc[:, df.columns.str.contains('P1')] >= 1).any(axis=1) & (df.loc[:, df.columns.str.contains('P3')] >= 1).any(axis=1)]
    
[/code]

のようにかけます。

ただ今回の場合は「列名に **P1** を含む列」というより、「列名が **P1**
から始まる列」として、`df.columns.str.startswith('P1')` を使うほうが適当なきがします。

<https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.str.startswith.html>

[code]

    df[(df.loc[:,'label'] == 1) & (df.loc[:, df.columns.str.startswith('P1')] >= 1).any(axis=1) & (df.loc[:, df.columns.str.startswith('P3')] >= 1).any(axis=1)]
    
[/code]

さらには、カラム名の並びが既知であるならば、単純にSliceでもよいのではないでしょうか

[code]

    df[(df.loc[:,'label'] == 1) & (df.loc[:,'P1S1':'P1S3'] >= 1).any(axis=1) & (df.loc[:,'P3S1':'P3S3'] >= 1).any(axis=1)]
    
[/code]


CC BY-SA 4.0
2020-04-17T00:49:47.580
65696
2020-04-17T00:49:47.580
24801
65688
answer