【Pandas学习】多条件筛选DataFrame
一、按列筛选1、简单筛选2、多条件筛选二、按行筛选三、多条件组合
·
目录
一、按列筛选
1、简单筛选
DataFrame\Series
执行>
、<
、==
这些运算符时,会将每一个元素进行比较,得到一个由结果(Boolean
值)组成的相同大小的DataFrame\Series
返回。
df = pd.DataFrame({"A":[1,1,1,2,3],"B":[3,3,5,3,8],"C":[1,5,5,2,7],"D":[1,2,3,6,7]})
df
A B C D
0 1 3 1 1
1 1 3 5 2
2 1 5 5 3
3 2 3 2 6
4 3 8 7 7
df > 4
A B C D
0 False False False False
1 False False True False
2 False True True False
3 False False False True
4 False True True True
df["C"] > 4
0 False
1 True
2 True
3 False
4 True
Name: C, dtype: bool
2、多条件筛选
相同大小的DataFrame\Series
之间可以用&
、|
、~
运算符进行运算,得到由结果组成的相同大小的DataFrame\Series
(df["C"] > 4) & (df["D"] < 4)
0 False
1 True
2 True
3 False
4 False
dtype: bool
要注意的是,&
优先级比<
、>
、==
高级,所以要记得加括号;还有就是and
、or
、not
好像是被DataFrame/Series
用于其他的运算了,因此不能用以代替&
、|
、~
。
给df[]
传入一个由boolean
值组成Series
的话,就可以筛选出True
相应位置的行。
df[(df["C"] > 4) & (df["D"] < 4)]
A B C D
1 1 3 5 2
2 1 5 5 3
二、按行筛选
用loc
可以同时筛选行和列
df.loc[(df["C"] > 4) & (df["D"] < 4), (df.loc[0] == 1) & (df.loc[3] == 2)]
A C
1 1 5
2 1 5
DataFrame和list/dict/Serise比较时,会用每一行元素和list/dict/Series对应的元素进行比较
df[["A", "B"]] == [1, 3]
df[["A", "B"]] == {"B": 3, "A": 1}
df[["A", "B"]] == pd.Series({"A": 1, "B": 3})
A B
0 True True
1 True True
2 True False
3 False True
4 False False
需要注意的是list和Series里面元素的顺序。
这时对得到的DataFrame使用all()方法,将每列的boolean值进行&运算,得到一个包含结果的Series。
(df[["A", "B"]] == pd.Series({"A": 1, "B": 3})).all(1)
0 True
1 True
2 False
3 False
4 False
dtype: bool
需要注意all()中的要加参数1,表示计算每一行的值,默认0的是计算每一列的值。
这样就可以将Series传入df[]中进行筛选了。
df[(df[["A", "B"]] == pd.Series({"A": 1, "B": 3})).all(1)]
A B C D
0 1 3 1 1
1 1 3 5 2
三、多条件组合
##df[(条件1)&(条件2)&(条件3)&...](只能筛选行)
df[(df["C"] > 4) & (df["D"] < 4)]
##df.loc[(列条件1)&(列条件2)&(列条件3)&..., (行条件1)&(行条件2)&(行条件3)&...]
df.loc[(df["C"] > 4) & (df["D"] < 4), (df.loc[0] == 1) & (df.loc[3] == 2)]
##必须用&、|、~来表示且、或、否,不能用and、or、not
##条件中如果带有比&、|、~低级的运算符,要记得给条件加括号
##loc只筛选行的话用:代替列条件部分
##条件是一个list/dict/Series的时候
##df[(df[[列1,列2]] == list/dict).all(1)]
df[(df[["A", "B"]] == [1, 3]).all(1)]
df[(df[["A", "B"]] == {"A": 1, "B": 3}).all(1)]
df[(df[["A", "B"]] == pd.Series({"A": 1, "B": 3})).all(1)]
##这种方法不适用于筛选列, 可以先将DataFrame转置
更多推荐
已为社区贡献2条内容
所有评论(0)