我有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
之间的行。
你能建议一种优雅的方式来选择这些行吗?
答案 0 :(得分:17)
我认为下面应该这样做,但它的优雅是有争议的。
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))]
答案 1 :(得分:12)
更短的版本:
In [65]:
df[(df>=0)&(df<=20)].dropna()
Out[65]:
Name C1 C2 C3
1 BBBB 12 1 10
答案 2 :(得分:6)
我喜欢将df.query()用于这类事情
df.query('C1>=0 and C1<=20 and C2>=0 and C2<=20 and C3>=0 and C3<=20')
答案 3 :(得分:3)
df.query("0 < C1 < 20 and"
"0 < C2 < 20 and"
"0 < C3 < 20")
或者更简洁:
df.query("0 < @df < 20").dropna()
后者使用frame.query
的{{1}}语法(引用其文档:“您可以通过在其前面添加@foo
字符来引用环境中的变量”。