pandas的使用方法
一、基本使用方法
# pandas引入约定 import pandas as pd from pandas import Series,DataFrame import numpy as np import matplotlib.pyplot as plt # pandas数据结构 # pandas数据结构介绍 # Series:一种类似于一维数组的对象,它是由一组数据(各种numpy数据类型) # 以及一组与之相关的数据标签(即索引)组成,仅由一组数据即可产生简单的series # DataFrame:一个表格型的数据结构,含有一组有序的列,每列可以是不同的值类型 # (数值,字符串,布尔值等),dataframe即有行索引也有列索引,可以被看做是由series组成的字典 arr=np.arange(20) # 建立一个一维的数组对象 series=Series(arr) print(series) # 查看索引 print(series.index) # RangeIndex(start=0, stop=20, step=1) # 数据index绑定 series01=Series([98,56,88,45],index=['语文','数学','英文','体育']) print(series01) print(series01.index) print(series01.values) # numpy中的数组运算,在series中都保留使用,并且series进行数组运算时,索引与值之间的映射关系不会改变 # series缺失值检测 # pandas中的isnull和notnull函数可用于series缺失值检测 # isnull和notnull都返回一个布尔类型的series series2=Series([1,2,3,4,np.nan,5,6,7,8,9]) print(series2) # 检测是否为空 print(series2.isnull()) # 检测是否不为空 print(series2.notnull()) # series自动对齐 # 不同series之间进行算术运算,会自动对齐不同索引的数据 # index之间会自动对应 num=Series([23,45,67,89],index=['p3','p1','p2','p5']) print(num) price=Series([9.98,2.34,4.56,5.67,8.78],index=['p1','p2','p3','p4','p5']) print(num*price) # series及其索引的name属性 # series对象本身及其索引都有一个name属性,可赋值设置,就是取别名 num.name='PrductName' num.index.name='PrductType' print(num) # pandas的数据导出与导入 print(pd.read_csv('ex1.csv')) print(pd.read_table('ex1.csv',sep=',')) # 设置header=none,列名称就以数字为列名称 print(pd.read_csv('ex2.csv',header=None)) print(pd.read_csv('ex2.csv',header=None,names=('a1','a2','a3','a4','a5'))) # 指定行索引 print(pd.read_csv('ex2.csv',header=None,names=('a1','a2','a3','a4','a5'),index_col='a5')) # 指定多个行索引 print(pd.read_csv('ex2.csv',header=None,names=('a1','a2','a3','a4','a5'),index_col=['a5','a1'])) print(pd.read_csv('ex3.csv')) # 加了sep会把第一列作为行索引 print(pd.read_table('ex3.csv',sep='\s+')) # 缺失值的处理 print(pd.read_csv('ex5.csv')) # 指定设置缺失值 print(pd.read_csv('ex5.csv',na_values={'message':['world','foo'],'d':['4']})) # 读取大量数据的处理 # 先读取10行数据 print(pd.read_csv('ex6.csv',nrows=10)) # 利用迭代功能来读取大量数据 tr=pd.read_csv('ex6.csv',chunksize=1000) # tr是一个迭代器 print(tr) result=pd.Series([]) for chunk in tr: # 先统计每个相同key的个数, result=result.add(chunk['key'].value_counts(),fill_value=0) print(result) result=result.sort_values(ascending=False) print(result[:10]) # 写入数据 df=pd.read_csv('ex5.csv') # 会把读出来自己增加的行索引也写入文件 # df.to_csv('ex5_out.csv') # 导致再次读出来的时候,会多了一列无用索引 # print(pd.read_csv('ex5_out.csv')) # 可以指定写入不把索引号写入 # df.to_csv('ex5_out.csv',index=False) # print(pd.read_csv('ex5_out.csv')) # 指定其他参数的写入 print(df.to_csv('ex5_out.csv',index=False,header=None,columns=['b','c','message'])) print(pd.read_csv('ex5_out.csv')) # 索引对象 # 不管是series对象还是dataframe对象,都有索引对象 # 索引对象负责管理标签和其他元数据(比如轴名称等) # 通过索引可以从series,dataframe中取值或对某个位置的值重新赋值 # series或者dataframe自动化对齐功能就是通过索引进行的 # 通过索引从dataframe中取值 # 可以直接通过列索引获取指定列的数据 # 要通过行索引获取指定行数据需要ix方法 # dataframe # 通过二维数组创建dataframe # 通过字典的方式创建dataframe # 索引对象 # 2行索引,3列索引 df01=DataFrame([['tom','maerry','john'],[76,98,100]]) print(df01) # 3行索引,2列索引 df02=DataFrame([['tom',76],['merry',98],['john','100']]) print(df02) df=DataFrame([[1,2,3],[2,3,4]],index=['a','b']) print(df) # 按照列取值 print(df[0]) print(df[0]['a']) # 按照行取值 print(df[:1]) print(df[:1][2]) data={'apart':['1001','1002','1003','1001'], 'profits':[567.87,987.87,873,498.87], 'year':[2001,2001,2001,2000]} df=DataFrame(data) print(df) # apart profits yearx # 0 1001 567.87 2001 # 1 1002 987.87 2001 # 2 1003 873.00 2001 # 3 1001 498.87 2000 print(df.index) # RangeIndex(start=0, stop=4, step=1) print(df.columns) # Index(['apart', 'profits', 'year'], dtype='object') print(df.values) # [['1001' 567.87 2001] # ['1002' 987.87 2001] # ['1003' 873.0 2001] # ['1001' 498.87 2000]] # pandas基本功能 # 重新索引 # 丢弃指定轴上的项 # 索引,选取和过滤 # 算术运算和数据对齐 # 函数应用和映射 # 排序和排名 # 带有重复值的轴索引 df=DataFrame([[50,20,10], [50,30,20], [20,40,30],], index=['c','j','p'], columns=['c++','java','python']) print(df) # c++ java python # c 50 20 10 # j 50 30 20 # p 20 40 30 df.index=[1,2,3] print(df) df.columns=['c++编译型语言','Java解释型语言','python解释型语言'] print(df) n1=np.random.random((20,6)) print(n1) s2=DataFrame(n1) print(s2) # 默认前五行 print(s2.head()) # 默认后五行 print(s2.tail()) # 行的快速统计汇总,得到数据的规模,大致范围 print(s2.describe()) # 行与列的转置 print(s2.T) print(s2.T.describe()) # 按轴排序,axis=1代表列轴 0为行轴,ascending=False降排序,默认为True升序 print(s2.sort_index(axis=1,ascending=False)) # 按值排序 print(s2) # 依据第2列的数据进行升序排列by=[]可以添加多列名称 print(s2.sort_values(by=[2])) # 依据第0行的升序排序 print(s2.sort_values(by=[0],axis=1)) # 通过传递数值进行位置选择(选择的是行) print(s2.iloc[0])#[0]代表索引第0行 # 通过数值进行切片 # 取第0行到5行 print(s2.iloc[0:5,]) # 取第0索引行到4索引行中的第2索引行到第3索引行,顾头不顾尾 print(s2.iloc[0:5,][2:4]) # 取第0索引行到4索引行中的第2索引列到第3索引列 print(s2.iloc[0:5,2:4]) print(s2.iloc[2,2]) print(s2.iat[2,2]) # 布尔索引 # 整体过滤,获取所有大于0.5的值,小于的用NAN表示 print(s2[s2>0.5]) print(s2[1]) # 大于5的为True,小于5的为False print(s2[1]>0.5) # isin()过滤数据 s2.iloc[0,0]=1.2 print(s2) print(s2[s2[0].isin([1.2])]) # 缺失值的处理 # reindex()方法可以对指定轴上的索引进行修改(增加/删除) s3=s2.reindex(index=[i for i in range(11)] ,columns=list(s2.columns)+[0]) print(s3) s3.iloc[1,1]=np.nan print(s3) # 删除缺失值的行 # print(s3.dropna(how='any')) # 将缺失值设置为0 print(s3.fillna(0)) # 数据描述性统计 print(s3.mean()) # 制图 # 直方图 n1=np.random.randint(0,7,size=10) print(n1) s1=pd.Series(n1) # 数据元素统计 print(s1.value_counts()) n1=np.random.randint(0,10,size=100) df=Series(n1) print(df.value_counts())