Skip to content

Latest commit

 

History

History
188 lines (159 loc) · 4.86 KB

ch11_pandas高级选择操作.md

File metadata and controls

188 lines (159 loc) · 4.86 KB

目录

通过布尔向量选择过虑数据

通过isin

使用query

#通过布尔向量选择过虑数据#

当需要使用多个条件组合时可以使用操作符 "|"、"&"、"~" 他们分别代表"或"、"与"以及"非",且每个条件都使用括号包括起来

##对Series使用布尔向量选择数据##

示例:

#coding=utf-8
from pandas import Series,DataFrame
import numpy as np
#对于Series数据使用布尔向量过滤数据
l=[-1, 2, 3, 10, 20, -20, 90]
s=Series(l)
print '选择所有大于0的数据\r\n',s[s>0].tolist()
print '选择所有大于0且小于20的数据\r\n',s[(s>0) & (s<20)].tolist()
print '选择所有小于0或大于20的数据\r\n',s[(s<0) | (s>20)].tolist()
print '选择所有不大于0的数据\r\n',s[~(s>0)].tolist()

输出

选择所有大于0的数据
[2, 3, 10, 20, 90]
选择所有大于0且小于20的数据
[2, 3, 10]
选择所有小于0或大于20的数据
[-1, -20, 90]
选择所有不大于0的数据
[-1, -20]

##对DataFrame使用布尔向量选择数据##

示例

#coding=utf-8
from pandas import Series,DataFrame
import numpy as np
data=[{"name":'lxh',"age":20,"cp":'lm'},{"name":'xiao',"age":40,"cp":'ly'},{"name":'hua',"age":4,"cp":'yry'},{"name":'be',"age":70,"cp":'old'}]
df=DataFrame(data,columns=['name','cp','age'])
print '原数据\r\n',df

#简单的
print '所有age大于20的数据\r\n',df[(df["age"]>20)]
print '所有age大于20且小于70的数据\r\n',df[(df["age"]>20) & (df["age"]<70)]

#复杂的多条件

#这里使用map将会提升过滤速度
criterion = df['name'].map(lambda x: (x.startswith('x') | x.startswith('l')))
print '所有name以字母x或l开头的age数据\r\n',df[criterion]['age']
#多列过滤
print '所有name以字母x或l开头且age小于40的数据\r\n',df[criterion & (df['age']<40)]

输出

原数据
   name   cp  age
0   lxh   lm   20
1  xiao   ly   40
2   hua  yry    4
3    be  old   70
所有age大于20的数据
   name   cp  age
1  xiao   ly   40
3    be  old   70
所有age大于20且小于70的数据
   name  cp  age
1  xiao  ly   40
所有name以字母x或l开头的age数据
0    20
1    40
Name: age, dtype: int64
所有name以字母x或l开头且age小于40的数据
  name  cp  age
0  lxh  lm   20

#通过isin#

示例

#coding=utf-8
from pandas import Series,DataFrame
import numpy as np
data=[{"name":'lxh',"age":20,"cp":'lm'},{"name":'xiao',"age":40,"cp":'ly'},{"name":'hua',"age":4,"cp":'yry'},{"name":'be',"age":70,"cp":'old'}]
df=DataFrame(data,columns=['name','cp','age'])
print '原数据\r\n',df
#使用isin(values)
values={'name':['lxh','xiao']}
#取得每行对应的布尔值
index=df.isin(values).any(1)
print '取得每行对应的布尔值\r\n',index
print '选择name在[lxh,xiao]中的数据\r\n',df[index]

输出

原数据
   name   cp  age
0   lxh   lm   20
1  xiao   ly   40
2   hua  yry    4
3    be  old   70
取得每行对应的布尔值
0     True
1     True
2    False
3    False
dtype: bool
选择name在[lxh,xiao]中的数据
   name  cp  age
0   lxh  lm   20
1  xiao  ly   40

#使用query#

query方法允许使用表达式的方法来选取数据;如你想选择列索引(标签)为"age"的大于10小于40的数据则可以使用

query("10<age<40")

#coding=utf-8
from pandas import Series,DataFrame
import numpy as np
data=[{"name":'lxh',"age":20,"cp":'lm'},{"name":'xiao',"age":40,"cp":'ly'},{"name":'hua',"age":4,"cp":'yry'},{"name":'be',"age":70,"cp":'old'}]
df=DataFrame(data,columns=['name','cp','age'])
print '原数据\r\n',df
#使用query#
print '所有age大于10且小于40的数据\r\n',df.query('10<age<40')

print '选择name在[lxh,hua]中的数据\r\n',df.query('name==["lxh","hua"]')

print '选择name在[lxh,hua]中的数据方法二\r\n',df.query('["lxh","hua"] in name')

print '选择name不在[lxh,hua]中的数据\r\n',df.query('["lxh","hua"] not in name')

print '选择name在[lxh,hua]中且age大于10的数据\r\n',df.query('name==["lxh","hua"] and age>10')

print '选择name在[lxh,hua]中或age大于10的数据\r\n',df.query('name==["lxh","hua"] or age>10')

输出

原数据
   name   cp  age
0   lxh   lm   20
1  xiao   ly   40
2   hua  yry    4
3    be  old   70
所有age大于10且小于40的数据
  name  cp  age
0  lxh  lm   20
选择name在[lxh,hua]中的数据
  name   cp  age
0  lxh   lm   20
2  hua  yry    4
选择name在[lxh,hua]中的数据方法二
  name   cp  age
0  lxh   lm   20
2  hua  yry    4
选择name不在[lxh,hua]中的数据
   name   cp  age
1  xiao   ly   40
3    be  old   70
选择name在[lxh,hua]中且age大于10的数据
  name  cp  age
0  lxh  lm   20
选择name在[lxh,hua]中或age大于10的数据
   name   cp  age
0   lxh   lm   20
1  xiao   ly   40
2   hua  yry    4
3    be  old   70