可直接去看 pandas文档 Indexing and selecting data
##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转置
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
相同大小的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
这样遍历其他DataFrame
取出的条件信息就可以很直接地进行比较了。