1、逻辑与
Pandas中用符号 & 表示逻辑与,连接两个逻辑语句,同时为真才为真。
在Python基本语法中,使用 and 表示逻辑与,但是Pandas中只能用 & ,不能用and,会报模糊错误。
2、逻辑或
Pandas中用符号 | 表示逻辑或,连接两个逻辑语句,只要其中一个为真就为真。
在Python基本语法中,使用 or 表示逻辑或,但是Pandas中只能用 | ,不能用or。
3、逻辑非
Pandas中用符号 ~ (键盘左上角)表示逻辑非,对逻辑语句取反。
在Python基本语法中,使用 not 表示逻辑非,但是Pandas中只能用 ~ ,不能用not。
print (3==3)
print not(3==3)
print ~(3==3)
# 结果
True
False
-2
print (6>1) & (8>7)
print (6>1) and (8>7)
print (8<1) | (8>1)
print (8<1) or (8>1)
print (not((8<1) | (8>1)))
print (~((8<1) | (8>1)))
#结果
True
True
True
True
False
-2
| 对应 or
& 对应 and
~ 对应 not
s = pd.Series(range(-3, 4))
print s
print s[(s < -1) | (s > 0.5)]
0 -3
1 -2
2 -1
3 0
4 1
5 2
6 3
dtype: int64
0 -3
1 -2
4 1
5 2
6 3
dtype: int64
使用Pandas从多个条件(AND,OR,NOT)中提取行的方法。
有以下2点需要注意:
- &,|,〜的使用(and、or、not的错误)
- 使用比较运算符时,请将每个条件括在括号中。
以下数据为例。
import pandas as pd
df = pd.read_csv('./data/09/sample_pandas_normal.csv')
print(df)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
本例是使用pandas.DataFrame,但pandas.Series也同样适用。
首先,展示如何从pandas.DataFrame中提取(选择)行以获得新的pandas.DataFrame。
1、使用布尔列表(数组)或pandas.Series,只能提取(选择)True行。
mask = [True, False, True, False, True, False]
df_mask = df[mask]
print(df_mask)
# name age state point
# 0 Alice 24 NY 64
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
2、通过AND,OR,NOT多个条件提取(选择)行的代码-示例
具有两个条件值的pandas.Series,可以使用&获得如下结果。在这里,为了便于说明,将==和〜用作二个条件,但是仅使用!=也是可以。
print(df['age'] < 35)
# 0 True
# 1 False
# 2 True
# 3 False
# 4 True
# 5 True
# Name: age, dtype: bool
print(~(df['state'] == 'NY'))
# 0 False
# 1 True
# 2 True
# 3 True
# 4 True
# 5 False
# Name: state, dtype: bool
print((df['age'] < 35) & ~(df['state'] == 'NY'))
# 0 False
# 1 False
# 2 True
# 3 False
# 4 True
# 5 False
# dtype: bool
仅提取(选择)True行。
df_and = df[(df['age'] < 35) & ~(df['state'] == 'NY')]
print(df_and)
# name age state point
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
对于OR也是如此。使用|。
print((df['age'] < 20) | (df['point'] > 90))
# 0 False
# 1 True
# 2 True
# 3 False
# 4 False
# 5 False
# dtype: bool
df_or = df[(df['age'] < 20) | (df['point'] > 90)]
print(df_or)
# name age state point
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
3个以上条件的运算符的优先级
运算符的优先级是NOT(〜),AND(&),OR(|)。因此,结果因顺序而异。
df_multi_1 = df[(df['age'] < 35) | ~(df['state'] == 'NY') & (df['point'] < 75)]
print(df_multi_1)
# name age state point
# 0 Alice 24 NY 64
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
df_multi_2 = df[(df['age'] < 35) & (df['point'] < 75) | ~(df['state'] == 'NY')]
print(df_multi_2)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
将每个组括在括号中比较安全。
df_multi_3 = df[((df['age'] < 35) | ~(df['state'] == 'NY')) & (df['point'] < 75)]
print(df_multi_3)
# name age state point
# 0 Alice 24 NY 64
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 5 Frank 30 NY 57