Выбор строк на основе нескольких значений столбцов в pandas dataframe

У меня есть pandas DataFrame df:

import pandas as pd

data = {"Name": ["AAAA", "BBBB"],
        "C1": [25, 12],
        "C2": [2, 1],
        "C3": [1, 10]}

df = pd.DataFrame(data)
df.set_index("Name")

который выглядит так, когда печатается (для справки):

      C1  C2  C3
Name            
AAAA  25   2   1
BBBB  12   1  10

Я хотел бы выбрать строки, для которых C1, C2 и C3 имеют значения между 0 и 20.

Можете ли вы предложить элегантный способ выбора этих строк?

Ответ 1

Я думаю, что ниже это должно сделать, но его элегантность обсуждается.

new_df = old_df[((old_df['C1'] > 0) & (old_df['C1'] < 20)) & ((old_df['C2'] > 0) & (old_df['C2'] < 20)) & ((old_df['C3'] > 0) & (old_df['C3'] < 20))]

Ответ 2

Более короткая версия:

In [65]:

df[(df>=0)&(df<=20)].dropna()
Out[65]:
   Name  C1  C2  C3
1  BBBB  12   1  10

Ответ 3

Мне нравится использовать df.query() для таких вещей

df.query('C1>=0 and C1<=20 and C2>=0 and C2<=20 and C3>=0 and C3<=20')

Ответ 4

Построение на двух последних ответах: можно также использовать синтаксис frame.query a < b < c:

  • df.query("(0 < C1 < 20) and (0 < C2 < 20) and (0 < C3 < 20)")

и/или frame.query @foo (цитируя его документацию: "Вы можете ссылаться на переменные в среде, префикс их символом @):

  • df.query("0 < @df < 20").dropna()