- 进阶操作
- 复杂查询
- 逻辑运算
- 函数筛选
- 比较函数
- df.query()查询
- df.filter()筛选
- 按数据类型查询
- 数据类型转换
- 转换为时间类型
- 数据排序
- 添加修改
进阶操作 复杂查询 逻辑运算
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:integersignedunsignedfloat
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(上下均值)ffillbfill
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')
#填充空值



