pandas基本操作(一):创建数组+数据整形+数据透视

一、创建数组

(一)pd.series创建一维数组

pd.series(data,index)
- data是数据内容,可以是字典、标量或者ndarray对象
- index是标签(可不指定)
import  pandas as pd
import numpy as ny

#创建pandas的一维数组
s1=pd.Series([1,3,4,np.NaN,8,4])    #列表
s2=pd.series(5,index=list('abcde'))   #标量
s3=pd.series(np.random.randn(5))    #5个随机数
s4=pd.series({'a':0,'b':1,'c':2,'d':3}list('abcde'))  #字典,多出来的e将会是NaN

(二)pd.DataFrame创建二维数组

pd.DataFrame(data,index=index,columns=columns)
- index是行标签,columns是列标签
- data可以是由一维numpy数组、list、series构成的字典,也可以是二维numpy数组,或者是series,另外的dataframe对象
#创建pandas的二维数组
dates=pd.date_range('20160301',periods=6)
s2=pd.DataFrame(np.random.randon(6,4),index=dates,columns=list('A','B','C'))  #随机数

#通过字典创建pandas的二维数组
d={'A':1,'B':pd.Timestamp('20160301'),'C':range(4),'D':np.range(4)}  
df=pd.DataFrame(d)
df.A   #可以通过列标签查看数据

d={'one':pd.series([1,2,3],index=['a','b','c']),
	'two':pd.series([1,2,3,4],index=['a','b','c','d'])	}  #通过series创建的数组,长度可以不相同
s=pd.DataFrame(d)

d={'one':[1,2,3]
	'two':[1,2,3,4]}   #通过list创建的数组,长度必须相同。此例长度不同,将报错
pd.series(d,index=['a','b','c'])

d=[(1,2,3),(2,3,4)]   #列表元素

d=[{'a':1,'b':2},{'a':1,'b':2,'c':3}]  #列表中包含字典
pd.series(d)  #可以指定行标签,列标签如果不指定,将是a、b、c

(三)panel创建面板数据

data.panel(data,items,major_axis,minor_axis)
items是坐标轴0,major_axis是坐标轴1,minor_axis是坐标轴2

二、查看数组的相关信息

#查看数组的前两行、后两行
data.head(2)   
data.tail()    #默认返回5行

#查看行标签、列标签、值
data.index
data.columns
data.values

#查看数据的最大值、最小值等基本数据分析
data.describe() 

#选择数据
data.A             #列标签
data[2:4]
data['20160301']   #行标签
data.loc['A']       #loc函数寻找数据的效率比较高
data.loc['20160302']  
data.loc['20160302':'20160305',['B','C']]
data.iloc[2:4]      #iloc函数通过位置选择数据
data.at[pd.Timestamp('20160302'),'B']   #通过at函数访问数组里某个特定的值
data.iat[1,1]       #通过iat函数访问数组里某个特定的值,比iloc效率更高
data[data>0]        #通过布尔选择数据:这里将会筛选出数值大于0的值
data[data.TAG.isin(['a','c'])]  #通过isin函数选择数据:输出data的TAG列里的值属于['a','c']数组的向量

三、数组的基本操作

#对数组进行转置
data.T  	
	
#排序:根据列标签排序,变成降序,即DCBA
data.sort_index(axis=1,ascending=False)  
#根据行标签降序排列
data.sort_index(axis=0,ascending=False)  
#根据A列的数值进行从大到小的排序
data.sort_values(by='A',ascending=False)

#对数组中的数据进行排名
s=pd.series([1,2,3,8,6,5])
s.rank(method='first')  #对数组s中的每个数据进行排名,first表示先出现的先排名。对于二维数组来说,将会分别对数组中的每一列元素进行排名


#修改数据
data.iat[0,0]=100       #修改某个数据
data.B=200              #修改某列数据
data['TAG']=range(0,5)  #通过函数修改某列的值,但是长度要匹配
data.iloc[1:2,2:5]		#修改多列多行的数据

#删除
del df['one']
df.drop('A')   #默认按行,填写axis=1,将会按列

#增加
df['five']=5  #增加一列five,值为5

#insert插入
df.insert(1,'bar',df['one']+df['two'])  #将数组df第一列和第二列的值相加,命名为bar,插入位置为第1列的后面

#assign插入
df.assign(ratio=df.one+df.two)
df.assign(ratio=lambda x:x.one-x.two)   #insert是在原数组中操作,assign会复制一个数组,再进行插入操作.这里是插入了一个ratio列,数值为第一列减去第二列
df.assign(abratio=df.one/df.two).assign(barvalue=lambda x: x.abration+x.two)  后面一个assign必须用匿名函数,因为前一个数组没有命名

#人为的制造缺失数据,再过滤空数据
df1=df.reindex(index=dates[0:4],columns=list(df.columns)+['E'])   #在数组df的基础上,新建E列。reindex也可以用来新建行
df1.loc[dates[1:3],'E']=2
df1.drops()          #操作1:扔掉空数据
df1.fillna(value=5)  #操作2:将空数据添上5
pd.isnull(df1).any().any()     #查看数组里是否有空值。若有,则返回True

#二维数组减一维数组
df1.sub(s,axis='index')  #二维数组df1减去一维数组s

#求累加值
df.apply(np.cumsum)

#计算数组中每个数字出现的次数
df.value_counts()
df.mode()    #输出出现次数最多的数字

#合并数组
pd.concat(df.iloc[:3],df.iloc[3:7],df.iloc[7:])
pd.merge(left,right,on='key')   #通过‘key’进行连接

#增加数据
s=pd.series(np.random.randiant(1,5,size=5),index=list('ABCDE'))
df.append(s,ignore_index=True)    #插入的时候,df没变,建立了一个新对象

#reindex新建一行或一列
s.reindex(list('abcde'),method='ffill')   #将缺失的数据填为前一行的数据
s.reindex(list('abcde',method='bfill'))  #将缺失的数据填为后一行的数据。但这个函数对列无效,无法填为前一列的s数据
s.reindex(list('abcde'),fill_value=0)   #将缺失的数据填上0


#数据分组
df.groupby('A').sum()
df.groupby(['A','B']).sum()

#使数组按行或按列进行运算
df.apply(lambda x:x.max()-x.min())  #默认按列,若按行,应写axis=1

四、数据整形

数据整形:将行索引和列索引进行互换
df.stack()      #行列索引转换
df.unstack()  #转换回去

五、数据透视

df.pivot_table(value=['D'],index=['A','B'],columns=['C'])  #以A和B为行索引,以C为列索引,以D为值
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页