Ответ 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))]
У меня есть 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
.
Можете ли вы предложить элегантный способ выбора этих строк?
Я думаю, что ниже это должно сделать, но его элегантность обсуждается.
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))]
Более короткая версия:
In [65]:
df[(df>=0)&(df<=20)].dropna()
Out[65]:
Name C1 C2 C3
1 BBBB 12 1 10
Мне нравится использовать df.query() для таких вещей
df.query('C1>=0 and C1<=20 and C2>=0 and C2<=20 and C3>=0 and C3<=20')
Построение на двух последних ответах: можно также использовать синтаксис 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()