站点图标 AI技术聚合

pandas进阶教程

进阶操作

复杂查询

逻辑运算

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')
#填充空值

文章出处登录后可见!

已经登录?立即刷新
退出移动版