在Pandas数据框中基于多列数值选择行

36

我有一个 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

我想选择那些C1C2C3的值在020之间的行。

你能否提供一种优雅的方法来选择这些行?

4个回答

52
我认为以下代码应该可以实现,但它的优雅程度还有待商榷。
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))]

有没有除了 '&' 以外的方式使用 'or'? - Karma_X
喜爱这个优雅的注释 :D - Ray Walker
使用竖线符号“|”代替&符号,以实现“或”条件。 - RK Replogle

26

简短版:

In [65]:

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

20

我喜欢使用df.query()来处理这种情况

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

10
更简洁的 df.query
df.query("0 <= C1 <= 20 and 0 <= C2 <= 20 and 0 <= C3 <= 20")

或者

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

df.query 中使用 @foo 是指在环境中引用变量 foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接