进阶操作
复杂查询
逻辑运算
df.Q1 > 36
df.index == 1
df.loc[:,'Q1':'Q4'] > 60
#Pandas支持很多逻辑运算,这里不再介绍
函数筛选
# 可以在表达式处使用lambda函数
df.Q1[lambda s: max(s.index)] #查询最大的索引值
lambda 形式参数:函数表达式
比较函数
pandas提供了一些比较函数,使我们可以将逻辑表达式替换为函数形式
df.eq() #等于
df.ne() #不等于
df.le() #小于等于
df.lt() #小于
df.ge() #大于等于
df.gt() #大于
df.query()查询
df.query(expr) #使用布尔表达式查询df的列
#举例
df.query('Q1>Q2>90')
df.query('Q1+Q2>180')
df.query('Q1==Q2')
df.query('(Q1<50) & (Q2>40) and (Q3>90)')
#支持使用@符号引入变量
a = df.Q1.mean()
df.query('Q1 > @a+40')
df.eval() #与.query()类似
df.filter()筛选
df.filter() #行名和列名进行筛选,支持模糊匹配、正则表达式。
例:
df.filter(items=['Q1','Q2']) #选择两列
df.filter(regex='Q',axis=1) #列名包含Q的列
df.filter(regex='e$',axis=1) #以e结尾的列
df.filter(regex='1$',axis=0) #正则,索引名以1结尾的行
df.filter(like='2',axis=0) #索引中有2的行
df.filter(regex='^2',axis=0).filter(like='Q',axis=1)
按数据类型查询
df.select_dtypes(include=None, exclude=None)
include: 'float64' \ 'bool' \ 'number'
exclude: 同上
数据类型转换
#推断类型
df.infer_objects() #自动转换合适的数据类型
df.convert_dtypes() #自动转换,支持str类型
#指定类型
pd.to_XXX()
pd.to_numeric(,downcast='integer')#转为数字,且是int,而非float
#downcast:integer\signed\unsigned\float
pd.to_datatime(,errors='ignore')#转为时间
pd.to_timedelta(,errors='coerce')#转为时间差
pd.to_datatime(df[['year','month','day']])#组合成日期
#类型转换astype()
df.column.astype('int32')
df.astype({'Q1':'int32','Q2':'int32'})
#当数据的格式不具备转换为目标类型的条件时,需要先对数据进行处理。
#例如:80%
data.rate.apply(lambda x: x.replace('%','')).astype('float')/100
转换为时间类型
这里我想拿出来单独做笔记,因为我经常被时间类型是比较弄的焦头烂额。
pd.to_datatime()
s.astype('datatime64[ns]')
例:
t = pd.Series(['202000101','20001103'])
以上这些当转换格式挺好用,但如果筛选时间段,我建议还是用str类型,正则表达式比较好用,例如:
#筛选2000年以后的数据
data_20 = data[data.filter(regex='^20',ax=0)]
#正则表达式什么时候用查百度就行
数据排序
#索引排序
df.sort_index()
df.sort_index(ascending=False) #倒序
df.sort_index(axis=1) #列索引
df.sort_index(inplace=True) #改变原数据
df.sort_index(ignore_index=True) #重新建立索引
df.sort_index(na_position='first') #空值在前'last'
df.reindex() #指定自己定义顺序的索引
#数值排序
df.sort_values()
df.sort_values(by= ,ascending= ) #上面的参数也都有效
#按大小值排序
df.nsmallest(5, []) #按[]中列名排序,显示最小的5行数据
df.nlargest()
添加修改
#替换数据
df.replace(0,5) #0换5
df.replace([0,1,2],3) #012换3
df.replace([0,1,2],[3,4,5]) #对应替换
s.replace([1,2],method='bfill')#下一位作为填充
#method:pad(上下均值)\ffill\bfill
df.replace({}) #字典对应替换
df.replace({'Q1':1},100) #将Q1中的值1换为100
df.repalce({'Q1':{1:10,2:20}})#指定Q1列中的值1、2换为10、20
#正则表达式
df.replace(to_replace=r'',value='new',regex=True)
df.replace({'Q1':r''},{'Q1':'new'},regex=True)
df.replace(regex={r'':'new' 'foo':'xyz'})
df.replace(regex=[r'', 'foo'],value='new')
#填充空值
文章出处登录后可见!
已经登录?立即刷新