pandas 是一个强大的python数据分析工具包,基于numpy构建 ,数据结构Dataframe(二维),Series(一维)
安装 pip install pandas
引用 import pandas as pd
Series比较像一个列表或者字典
sr = pd.Series([1,3,5,7,9],index=list('abcde')) #通过指定索引也可以找到
获取索引和值的数组
sr.index
sr.values
通过key和value创建
pd.Series({'alpha':3,'beta':2})
Series特性
从ndarray创建:Series(arr)
从字典创建:Series(dis)
数学预算 sr*2 , sr1 + sr2 ,
通过索引获取sr[0],sr[[1,2,4]]通过自定义索引获取sr['a'],sr[['a','b','c']]
切片sr[0:2],sr['a':'c'],通过键key进行切片
过滤sr[ar>5]
in运算 'a' in sr 返回布尔型值
for运算 for x in sr.index: 或 for x in sr:
数学函数 np.abs(sr),mean(),sum(),cumsum()
其他函数get('a',default=0)
Series整数索引特性
sr = pd.Series([1,2,3,4,5,6,7,8])
sr2 = sr[3:].copy()
sr2[3] # 按照键key来进行数据获取,不是按照数组下标
sr2.loc[3] # 按照键key来进行数据获取
sr2.iloc[3] # 按照键数组下标来获取
sr1 = pd.Series([12,23,34],index=['c','a','d']);
sr2 = pd.Series([1,2,3],index=['d','c','a']);
sr1 + sr2 # 按照key进行相加
sr3 = pd.Series([1,2,3,4],index=['b','d','c','a']);
sr1 + sr3 # key无法匹配的情况返回NaN
# 使用函数add,sub,div,mul等可以给NaN设定值
sr1.add(sr3,fill_value=0)
#不想要NaN行数据
srx = sr1 + sr3
srx.dropna()
# 要NaN行数据对数据进行填充
srx = sr1 + sr3
srx.fillna(0.0)
srx.fillna(srx.mean()) # 填充平均数
srx.isnull() # 判断是否是NaN
srx.notnull() # 判断是否不是NaN
pandas:DataFrame
DataFrame是一个表格型的数据结构,含有一组有序数列
DataFrame可以看做是有Series组成的字典,并且共用一个索引
pd.DataFrame({'one':[1,2,3,4],'two':[5,6,7,8]},index=list('abcd'))
pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])})
CSV文件读取和写入
df = df.read_csv('file.csv')
df.loc[:,'start':'end'] #切片返回start到end列
df.index # 获取行 start,end step
df.colums # 获取列 列名数组
df.T # 行列转置
df.values # 去掉key变成二维数组
df.decribe() # 快速统计 返回求和,平均数,标准差,最小,最多,中位数...
df.rename(colums=['oldname':'newname','oln':'nnm']) #修改列名
df.head(10) #查看开始行
df.tail(10) # 查看尾行
DataFrame索引和切片
df['colums']# 取某一列
df[['colums','colums1']]# 取colums和colums1
df['colums']['index'] # 先取列然后取行
df.loc[:,'start':'end'] # 取所有行,然后切片返回start到end列
df.loc[12,'colums'] # 先取行后取列,loc属性key,iloc 属性下标,推荐
df.loc[0:10,'start':'end'] # 取0-10行,然后切片返回start到end列
df.iloc[3] #取第3行
df.iloc[3:5,1:3] #取第3-5行,然后1-3列
df.iloc[3:5] #取第3-5行,等价df.iloc[3:5,:]
df['colums']['0'] = 120 # 修改
df[0,'colums'] = 120 # 修改不产生视图,推荐
df[df['col']>0] #过滤某一列中大于0的数
df[df['col'].isin([1,3,5])] #过滤某一列中数必须在1,3,5中
DataFrame数据对齐,行对其,列对齐,不存在NaN
df.fillna(10) # 填充
df.dropna() #只要有NaN就删除
df.dropna(how='all') #全部是NaN就删除
df.dropna(axis=1) #axis=0行,axis=1列,列全是NaN删除
df.dropna(axis=1,how='all') #列全是NaN才删除
DataFrame函数
df.mean() #按列求平均数
df.mean(axis=1) #按行求平均数
df.sum() # 求和
df.sort_values('col',ascending=False) #按列排序
df.T.sort_values('col',axis=1,ascending=False) #按行排序
df.sort_index(ascending=False) #按索引降序
Numpy的其他函数也试用与pandas
apply(func,axis=0) 将自定义函数应用在各行或者各列上,func可返回标量或者Series
df.apply(lambda x:(x['height'] + x['low'])/2,axis=1) # 求每一行的最高值和最低值的平均
df.apply(lambda x:pd.Series([(x['height'] + x['low'])/2,(x['open'] + x['close'])/2],index=['hl_mean','oc_mean']),axis=1) # 求每一行的最高值和最低值的平均,和每一行开盘和收盘平局值
applymap(func) 将函数应用在DataFrame各个元素上
df.applymap(lambda x:x+1) #所有元素加1等同于df+1
map(func) 将函数应用在Series各个元素上
pandas数据分组
df = pd.DataFrame({'data1':np.random.uniform(10,20,5),'data2':np.random.uniform(-10,10,5),'key1':list('abbab'),'key2':list('gfggf')},index=list('ABCD'))
df.groupby('key1').mean() # 分组计算
df.groupby(['key1','key2']).mean() # 多列分组计算
df.groupby(lambda x:'plus' if df.loc[x,'data1']>0 else 'minus').mean()# 自定义分组计算,按数据正负进行分组
df.groupby('key1').groups #获取分组信息
df.groupby('key1').get_group('a') #获取其中一个分组信息
for name, group in df.groupby('key1'): #循环一个分组
pandas数据聚合
df.groupby('key1').max() # 分组计算
df.groupby('key1').agg(lambda x:x.max()-x:min) # 自定义分组计算,求分组后最大值减去最小值
df.groupby('key1').agg(['data1':'min','data2':'max']) # 自定义分组计算data1求最小值,data2求最大值