python数据处理(二)pandas的使用

1、pandas基本介绍

import pandas as pd
import numpy as np
s=pd.Series([1,2,6,np.nan,44,1])
#创建pd序列,np.nan代表空值。打印时会自动加序号和元素dtype
dates=pd.date_range('20160101',periods=6)#从1号到6号的日期序列,也返回dtype
df=pd.DataFrame(np.random.randn(6,4),index=date,columns=['a','b','c','d'])
#二维矩阵,但是有行列索引index是行名称,columns是列索引/名称
df1=pd.DataFrame(np.arange(12).reshape((3,4)))#默认索引时0-n-1
df2=pd.DataFrame({'A':1,
                  'B':pd.Timestamp('20130102'),
                  'C':pd.Series(1.,index=list(range(4)),dtype='float32'),
                  'D':np.array([3]*4,dtype='int32'),
                  'E':pd.Categorical(["test","train","test","train"]),
                  'F':'foo'})
#字典的keys()作为列名,A中只有一个元素,就每一行相应列都放上1

df2
DataFrame的属性

import pandas as pd
import numpy as np
df2.types#每一列的dtype
df2.index#所有行的序号
df2.columns#输出所有列的序号
df2.values#输出所有值,是array类型
df2.describe()#描述数值列的一些基本属性,如count,mean,std,min,25%,40%,75%,max
df2.T#转置
df2.sort_index(axis=1,ascending=False)
#axis决定对行还是列排序,ascending决定升序还是降序,
#axis=1是对列索引排序,=0是对行索引排序
df2.sort_values(by='E')#对单行值进行排序

2、pandas选择数据

import pandas as pd
import numpy as np
dates=pd.date_range('20200801',periods=6)
df=pd.DataFrame(np.arange(24).reshape((4,6)),
                index=dates,column=['A','B','C','D'])
df['A']#选择某一列
df.A#同上
df[0:3]#切片,选取若干行
df['20200801':'20200803']#切片,选取若干行
df.loc['20200801']#以标签形式选取一行
df.loc[:,['A','B']]#选取所有行,A,B两列
#按位置选择
df.iloc[3]#打印第三行
df.iloc[3:5,0:2]#切片
df.iloc[[1,3,5],1:3]#不连续筛选
#混合筛选既可以用坐标又可以用索引,但最好不用
df.ix[:3,['A','C']]
#布尔筛选
df[df.A>8]#筛选出A>8中的相应行

3、pandas设置值

import pandas as pd
import numpy as np
dates=pd.date_range('20200801',periods=6)
df=pd.DataFrame(np.arange(24).reshape((4,6)),
                index=dates,column=['A','B','C','D'])
df.iloc[2,2]=111
df.loc['20200801','B']=222
df[df.A>0]=0#大于0的数字改为0,所有列的数字都变为零
df.A[df.A>0]=0#只改A列
df.B[df.A>0]=0#也可以改变B列值
df['F']=np.nan#加一个空列
df['E']=pd.Series([1,2,3,4,5,6],index=pd.date_range('20200801',periods=6))
#增加有值的列,行标签要和df的行标签相等

4、pandas处理丢失数据

import pandas as pd
import numpy as np
dates=pd.date_range('20200801',periods=6)
df=pd.DataFrame(np.arange(24).reshape((4,6)),
                index=dates,column=['A','B','C','D'])
df.iloc[0,1]=np.nan
df.oloc[1,2]=np.nan
df.dropna(axis=0,how='any')#how={'any'|'all'}只要有1个Nan就删除整个行
#axis=0表示第一个维度,对df.iloc[k]这种形式的数据处理
df.fillna(value=0)#把nan填入0
df.isnull()#是不是有缺失,返回一个由True False组成的矩阵
np.any(df.isnull())==True#判断是不是至少有一个Nan

5、pandas导入导出

可以读取excel,csv,sql,pickle,html等格式
以csv为例

import pandas as pd
import numpy as np
data=pd.read_csv('student.csv')#行名称,列名称都自动包括了,是算作索引的
data.to_pickle('student.pickle)#存储到pickle格式

6、pandas合并concat

import pandas as pd
import numpy as np
#concatenating
df1=pd.DataFrame(mp.ones((3,4))*0,columns=['a','b','c','d'])
df2=pd.DataFrame(mp.ones((3,4))*1,columns=['a','b','c','d'])
df3=pd.DataFrame(mp.ones((3,4))*2,columns=['a','b','c','d'])
#列名相同,想要合并,需要上下合并
result=pd.concat([df1,df2,df3],axis=0)
#此时行索引为0,1,2,0,1,2,0,1,2
res=pd.concat([df1,df2,df3],axis=0,ignore_index=True)
#行索引可以重新排序,为0,1,...,8

#join,['inner','outer']
df1=pd.DataFrame(mp.ones((3,4))*0,columns=['a','b','c','d'],index=[1,2,3])
df2=pd.DataFrame(mp.ones((3,4))*1,columns=['b','c','d','e'],index=[2,3,4])
#两个的column_index有所不同
res=pd.concat([df1,df2],axis=0)#此时有a,b,c,d,e5列,但df2中没有a列的值,都用Nan填充
#这是默认的join模式,为join='outer'
res=pd.concat([df1,df2],axis=0,join='inner')#只有bcd三个公共列

#join_axes
df1=pd.DataFrame(mp.ones((3,4))*0,columns=['a','b','c','d'],index=[1,2,3])
df2=pd.DataFrame(mp.ones((3,4))*1,columns=['b','c','d','e'],index=[2,3,4])
res=pd.concat([df1,df2],,axis=1,join_axes=[df1.index]')#左右合并时序号会有冲突,
#此时按照df1的index进行合并,df2中没有的有Nan填充,
#忽略掉df2中的index 4.列为a,b,c,d,b,c,d,e,也就是说此时不对列进行处理

#append
df1=pd.DataFrame(mp.ones((3,4))*0,columns=['a','b','c','d'])
df2=pd.DataFrame(mp.ones((3,4))*1,columns=['b','c','d','e'])
res=df1.append(df2,ingore_index=True)#同样是列添加
res=df1.append([df2,df3],ingore_index=True)#可以添加多个
s1=pd.Series([1,2,3,4],index=['a','b','c','d'])
res=df1.append(s1,ingore_index=True)#一行一行添加

7、pandas合并merge

import pandas as pd
import numpy as np
left=pd.DataFrame({'key':['K0','K1','K2','K3'],
                   'A':['A0','A1','A2','A3'],
                   'B':['B0','B1','B2','B3']})
left=pd.DataFrame({'key':['K0','K1','K2','K3'],
                   'C':['C0','C1','C2','C3'],
                   'D':['D0','D1','D2','D3']})
#基于key合并
res=pd.merge(left,right,on='key')#只有4行,key相等的行并到一行
#两个key时
left=pd.DataFrame({'key1':['K0','K0','K1','K2'],
                   'key2':['K0','K1','K0','K1'],
                   'A':['A0','A1','A2','A3'],
                   'B':['B0','B1','B2','B3']})
left=pd.DataFrame({'key1':['K0','K1','K1','K2'],
                   'key2':['K0','K0','K0','K0'],
                   'C':['C0','C1','C2','C3'],
                   'D':['D0','D1','D2','D3']})
res=pd.merge(left,right,on=['key1,key2'])#只有key1,key1两列都相等时才会合并,
#其它合并不了的不管,默认join=inner相当于sql的等值连接。
res=pd.merge(left,right,on=['key1,key2'],how='outer')#相当于sql的全连接
#how={'inner','outer','left','right'}
#分别对应数据库的等值连接,全连接,左连接,又连接。没有的值用Nan填充

#indicator
df1=pd.DataFrame({'col1':[0,1],'col_left':['a','b']})
df1=pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})
res=pd.merge(df1,df2,on='col1',how='outer',indicator=True)
#indicator会显示merger的过程,多一列,列名为_merge :显示left_only,both,right_only
res=pd.merge(df1,df2,on='col1',how='outer',indicator='indicator_column')
#给indicator那一列命名

#index
left=pd.DataFrame({'A':['A0','A1','A2'],
                   'B':['B0','B1','B2']},
                   index=['K0','K1','K2'])
left=pd.DataFrame({'C':['C0','C2','C3'],
                   'D':['D0','D2','D3']},
                   index=['K0','K2','K3'])
res=pd.merge(left,right,left_index=True,right_index=True,how='outer')
#对index进行合并left_index=True代表考虑left 的index进行合并

#处理重叠问题
boys=pd.DataFrame({'k':['K0','K1','K2'],'age'=[1,2,3]})
girls=pd.DataFrame({'k':['K0','K0','K3'],'age'=[4,5,6]})
res=pd.merge(boys,girls,on='k',suffixes=['_boy','_girl'],how='inner')
#两组数据里age的名字是重复的,但是在合并后需要是两列,
#且可以在合并后加上名字后缀加以区分,此时列变为age_boy和age_girl

8、pandas plot画图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#plot data
#Series
data=pd.Series(np.random.randn(1000),index=np.arange(1000))
data=data.cumsum()#累加
data.plot()
plt.show()#就可以显示图像了

#DataFrame
data=pd.DataFrame(np.random,randn(1000,4),
                  index=np.arange(1000),column=list("ABCD"))
data=data.cumsum()
data.head()#显示数据
data.plot()
plt.show()#分为A,B,C,D四条线

#scatter
ax=data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class 1')#画点,不连线
data.plot.scatter(x='A',y='C',color='DarkGreen',label='Class 2'ax=ax)
#ax=ax是在一张图上显示
plt.show()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值