不取非集(后面会提到)
import pandas as pd
a=pd.read_csv("head.csv")
a
id | shuju | label | |
---|---|---|---|
0 | 1 | 3 | postive |
1 | 2 | 7 | negative |
2 | 5 | 7 | postive |
3 | 6 | 8 | postive |
4 | 3 | 5 | negative |
现在我们想取 比如 shuju这一列 小于等于7的
b=a[a['shuju']>=4]
b
id | shuju | label | |
---|---|---|---|
1 | 2 | 7 | negative |
2 | 5 | 7 | postive |
3 | 6 | 8 | postive |
4 | 3 | 5 | negative |
现在我们想取 比如 shuju这一列 小于等于7大于等于4的
b=a[a['shuju']<=7&&a['shuju']>=4]
File "<ipython-input-13-2ca594e63fc5>", line 1
b=a[a['shuju']<=7&&a['shuju']>=4]
^
SyntaxError: invalid syntax
可以看到,上面的式子会报错,在那个&号那里
#############我们改成单个&
b=a[a['shuju']<=7&a['shuju']>=4]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-14-eee3584da3f0> in <module>()
1 #############我们改成单个&
----> 2 b=a[a['shuju']<=7&a['shuju']>=4]
~/.local/lib/python3.5/site-packages/pandas/core/generic.py in __nonzero__(self)
1467 raise ValueError("The truth value of a {0} is ambiguous. "
1468 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1469 .format(self.__class__.__name__))
1470
1471 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
可以发现,上面的式子仍然会报错,但是错误比原来轻了
#############我们给单个式子加个括号
b=a[(a['shuju']<=7)&(a['shuju']>=4)]
b
id | shuju | label | |
---|---|---|---|
1 | 2 | 7 | negative |
2 | 5 | 7 | postive |
4 | 3 | 5 | negative |
现在就可以了!!!!
就是两个要点!!! ①逻辑运算符只能要一个 ②需要给每个逻辑表达式单独的加个括号
对这种按条件取行的原理的解释
a['shuju']>=4
0 False
1 True
2 True
3 True
4 True
Name: shuju, dtype: bool
可以看到,上面的逻辑表达式,会将’shuju’ 那一列的每一个元素与4进行比较,比4大的,就成True
a[a['shuju']>=4]
id | shuju | label | |
---|---|---|---|
1 | 2 | 7 | negative |
2 | 5 | 7 | postive |
3 | 6 | 8 | postive |
4 | 3 | 5 | negative |
上面这步操作,实际上就是用一个bool的series来取行,那个series为True的行都会被取出来
取非集(比如 取除了小于等于7大于等于4之外的其他行)
通过上面对原理的解释,我们知道,其实按条件取行,也就是把 True的行取出来而已,
现在想要把那些不是True的行取出来,
其实就是把原来是True的行变成False,False变成True就行啦!!!
也就是一个使用一个apply+lambda 将False的映射为True ,True映射为False即可