pandas 学习笔记05 高级操作

1 复杂查询

#复杂查询
#逻辑运算,返回的bool值
df.Q1>36 #大于36的返回True
df.index==1 #索引等于1(True),其余为Flase
df.loc[:,'Q1':'Q4']>60  #只取数字部分,否则字符无大于会报错
~(df.Q1<60)&(df['team']=="C") #Q1成绩不小于60,并且是C组成员

#逻辑筛选数据[],iloc,loc,返回的是数据
#切片[],eg:
df[df['Q1']==8] #Q1等于8
df[~(df['Q1']==8)]
df[df['name']=='Ben'] #name为Ben
df[df.Q1>df.Q2]
#.loc和.iloc的eg:
#表达式与切片一致
df.loc[df['Q1']>90,'Q1':] #Q1大于90,只显示Q1及以后的列
df.loc[(df.Q1>90)&(df.Q2<80)] #and关系
df.loc[(df.Q1>80)|(df.Q2<15)] #or关系
df.loc[df['Q1']>90,'Q1'] #Q1大于90,只显示Q1

#any,all对逻辑计算后的布尔值序列再进行判断,序列都为True,all才返回True,序列只要有一个为True,any就返回True,axis参数整体约定是一样的
df[(df.loc[:,['Q1','Q2']]>80).all(1)] #Q1,Q2成绩全部超过80分,all(1)中的1代表axis的值
df[(df.loc[:,['Q1','Q2']]>80).any(1)] #Q1,Q2成绩任一一科超过80分

#函数筛选
df.Q1[lambda s:max(s.index)] #查询最大索引的值
max(df.Q1.index) #计算最大值

df[lambda df:df['Q1']==8]#Q1为8
df.loc[lambda df:df.Q1==8,'Q1':'Q4'] #Q1=8,显示Q1-Q4
df.loc[:,lambda df:df.columns.str.len()==4] #有真假值组成的序列
df.loc[:,lambda df:[i for i in df.columns if 'Q' in i]] #列名列表
df.iloc[:3,lambda df:df.columns.str.len()==2] #由真假值组成的序列

#比较函数
df[df.Q1.eq(60)] #等价于 df[df['Q1']==60]
# df.ne() #不等于
# df.le()#<=
# df.lt()#<
# df.ge()#>=
# df.gt#>=
df[df.Q1.ne(89)] #Q1!=89
df.loc[df.Q1.gt(90) &df.Q2.lt(90)] #and关系,Q1>90,Q2<90

#isin,eg:
df[df.team.isin(['A','B'])] #包含A、B两组
df[df.isin({'team':['C','D'],'Q1':['36','93']})] #复杂查询,其他值为NaN

#查询df.query(),相当于SQL中Where
df.query('Q1>Q2>90') #直接写类型SQL where 语句
df.query('Q1+Q2>180')
df.query('Q1==Q2')
df.query('(Q1<50) and (Q2>40)  & Q3>90') 
df.query('Q1>Q2>Q3>Q4')
df.query('team!="C"')
df.query('team not in ("E","A","B")')
#df.query('B ==`team name`')  
#支持传入变量,如大于平均分40分的
a=df.Q1.mean()
df.query('Q1>@a+40')
df.query('Q1>Q2+@a')

#df.eval()与df.query()类似
df[df.eval("Q1>90>Q3>10")]
df[df.eval('Q1>Q2+@a')]

#筛选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) #索引中以2开头,列名有Q的

#按数据类型查询 df.select_dtypes(include=None,exclude=None) #无满足的数据,返回索引列表
df.select_dtypes(include=['float64'])
df.select_dtypes(include=['bool'])
df.select_dtypes(include=['number'])
df.select_dtypes(exclude=['int'])
df.select_dtypes(exclude=['datetime64'])

2 数据类型转换

#df = pd.DataFrame(path,dtype='float') 对所有字段指定相同的类型
#df = pd.DataFrame(path,dtype={‘name':'string,'Q1':'int32'}) 对所有字段分别指定

#推荐类型
df.infer_objects().dtypes #支持object
df.convert_dtypes().dtypes #支持string

#指定类型 pd.to_xxx数据进行安全转换
m = ['1',2,3]
s = pd.to_numeric(m) #转成数字

#类型转换 astype()
df.Q1.astype('int32').dtypes
df.astype({'Q1':'int32','Q2':'int32'}).dtypes
df.index.astype('int64')
#df.astype('int32') 所有数据转成int32
s.astype('int64',copy=False) #不与元数据关联

#将89.3%转换成float
#data.rate.apply(lambda x:x.replace('%','').astype('float')/100)

#转为时间类型 pd.to_datetime() s.astype('datetime64[ns]')做数据转换
t = pd.Series(['20200801','20200802'])
pd.to_datetime(t)

3 数据排序

#索引排序 df.sort_index() df.reindex()
df.sort_index(ascending=False) #降序
df.sort_index(axis=1,ascending=False) #列名降序
#s.sort_index(inplace=True) #排序后生效,改变原数据
#数值排序 sort_values(),dataframe需传入列名
df.Q1.sort_values()
df.sort_values('Q4')
df.sort_values(by=['Q1','Q2'],ascending=[True,False])
#混合排序
# df.set_index('name',inplace=True)
# df.index.names=['s_name']
# df.sort_values(by=['s_name','team'])
df.set_index('name').sort_index().sort_values('team')

df.name.sort_values().index#按姓名排序后取出排名后的索引表
df.reindex(df.name.sort_values().index) #自定义索引
#按大小排序 nsmallest() 和nlargest()实现数字列排序,并指定返回的个数
df.nsmallest(5,['Q1','Q2']) #先按Q1最小在前,如果相同,Q2小在前

4.添加修改

#修改数值,同样的数据进行修改
df.iloc[0,0] #查
df.iloc[0,0] = 'Lily' #改
df[df['Q1']<60] = 60 #将Q1小于60的所有值修改成60

df.loc[0:3,'Q1':'Q2']
df1 = pd.DataFrame({'Q1':[1,2,3],'Q2':[4,5,6]})
df.loc[0:3,'Q1':'Q2'] = df1

#替换数据 replace
#s.replace(0,5) #0换5
df.replace(0,5) # 将数据中的所有零换成5
#df.replace([list1],[list2]) #对应修改,两个列表相等
# df.replace({0:10,1:100})
# df.replace({'Q1':0,'Q2':5},100)
# df.replace({'Q1':{0:100,4:100}}) #指定列。指定值修改
# df.replace(to_replace=r'^ba.$',value='new',regex=True)
# df.replace({'A':r'^ba.$'},{'A':'new'},regex=True)
# df.replace(regex={r'^ba.$':'new','foo':'xyz'})
# df.replace(regex=[r'^ba.$','foo'],value=new)

#填充空值 fillna
df.fillna(0) #将空值全部填充为0 默认为None
df.fillna(method='ffill') #将空值修改为前一个值

#修改索引名
df.rename(columns={'team':'class'})
df.rename(index={1:'x',2:'y'})
df.rename(index=str) #对类型进行修改

#增加列
#df['total']=df.Q1+df.Q2+df.Q3+df.Q4
#df['total']=df.sum(1)
#df['total'] = df.select_dtypes(include=['int']).sum(axis=1)
#df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x),axis=1)
df.loc[df.Q1>=60,'Q1成绩'] = '合格'
df.loc[df.Q1<60,'Q1成绩'] = '不合格'
#插入列 df.insert(loc,col,value)
#df.insert(2,'total1',df.sum(1))

#指定列 df.assign(k=v) 为指定一个新列的操作,k为新列列名,v为此列值

# df.assign(total=df.sum(1))
# df.assign(total=df.sum(1),Q=100)
# df.assign(total=df.sum(1)).assign(Q=100) #效果同上
# #使用链式方法
# (
#     df.assign(total=df.sum(1))
#     .assign(Q=100)
#     .assign(name_len=df.name.str.len())#姓名长度
#     .assign(avg=df.mean(1))
#     .assign(avg2=lambda d:d.total/4)
# )
# #df.head()
# df.assign(Q5=[100]*100)
# df = df.assign(Q5=[100]*100)  #赋值生效
# df.assign(Q6=df.Q1/df.Q2)
# df.assign(Q7=lambda d:d.Q1*9/5+32)
# df.assign(tag=df.Q1>df.Q2) #添加一列,值为表达式结果:ture或false
# df.assign(tag=(df.Q1>df.Q2).astype(int)) #比较计算,True为1,False为0
# df.assign(tag=(df.Q1>60).map({True:'及格',False:'不及格'})) #比较计算,True为1,False为0
# df.assign(Q8=lambda d:d.Q1*5,Q9=lambda d:d.Q8+1) #Q8没有生效,不能直接用df.Q8

#执行表达式df.eval()  以字符形式传入参数

# df.eval('total=Q1+Q2+Q3+Q4')
# df['C1']=df.eval('Q2+Q3')
# a=df.Q1.mean()
# df.eval('C3=`Q3`+@a')
df.eval("c3=Q2>(`Q3`+@a)")
df.eval('c4=team+name',inplace=True)

#增加行,使用loc给指索引增加一行
# df.loc[100]=['tom','A',88,88,88,88]
# df.loc[101]={'Q1':88,'Q2':99} #其余数据为NaN
# df.loc[df.shape[0]]={'Q1':88,'Q2':99} #自动增加索引
# df.loc[len(df)]={'Q1':88,'Q2':99} 
# df.tail()
#批量操作
# rows=[{'Q1':1,'Q2':2},{'Q1':3,'Q2':4},{'Q1':5,'Q2':6}] #传入字典,或者等长的列表
# for row in rows:
#     df.loc[len(df)] = row
# df.tail()

#追加合并,常用方法,追加的模式使用教少 df.append()
# #追加一行
# df1=pd.DataFrame([[1,2],[3,4]],columns=list('AB'))
# df2=pd.DataFrame([[5,6],[7,8]],columns=list('AB'))
# df2.append(df2)

# s1 = pd.Series(['a','b'])
# s2 = pd.Series(['c','d'])
# # pd.concat([s1,s2])
# pd.concat([s1,s2],ignore_index=True) #重新编索引
#df同理
# df1=pd.DataFrame([[1,2],[3,4]],columns=list('AB'))
# df2=pd.DataFrame([[5,6],[7,8]],columns=list('AB'))
# pd.concat([df1,df2],ignore_index=True)
#pd.concat([df1,df2],sort=False)
# pd.concat([df1,df2],join='inner') #只连接相同列
#df=pd.concat([df1,df2],axis=1) #连接列,相当于增加列

#删除 pop() 实时生效‘
#df.pop('Q1') #删除列
#s.pop(3) #返回被删除的值

#删除空值 df.dropna

df.dropna() #一行中有一个空值就全部删除
df.dropna(axis='columns') #只保留全有值得列
df.dropna(how='all') #行或列全没值才删除
df.dropna(thresh=2) #至少有两个空值才删除
df.dropna(inplace=True) #删除并使替换生效


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值