# 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())