1 pandas简介

  • Python在数据处理和准备方面一直做得很好,但在数据分析建模方面就差一些。pandas帮助填补了这一空白,使您能够在Python中执行整个数据分析工作流程,而不必切换到更特定于领域的语言,如R。
  • 与出色的 jupyter工具包和其他库相结合,Python中用于进行数据分析的环境在性能、生产率和协作能力方面都是卓越的。pandas是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。pandas是Python进行数据分析的必备高级工具。
  • pandas的主要数据结构是 Series(一维数据)与 DataFrame (二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数案例。
  • 处理数据一般分为几个阶段:
    (1)数据整理与清洗
    (2)数据分析与建模
    (3)数据可视化与制表
    (4)Pandas 是处理数据的理想工具
  • 安装方式(安装了python后,使用以下命令即可。推荐使用anaconda工具来创建python环境):
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

2 数据结构

2.1 Series

用列表生成 Series时,Pandas 默认自动生成整数索引,也可以指定索引

import numpy as np
import pandas as pdl = [0,1,7,9,np.NAN,None,1024,512]
# 无论是numpy中的NAN还是Python中的None在pandas中都以缺失数据NaN对待
s1 = pd.Series(data=l) # pandas自动添加索引
s2 = pd.Series(data=l,index=list('abcdefhi'),dtype='float32')
# 传入字典创建,key行索引
s3 = pd.Series(data={'a':99,'b':137,'c':149},name='python_score')
display(s1,s2,s3)

2.2 DataFrame

DataFrame是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的
字典。

import numpy as np
import pandas as pd
# index 作为行索引,字典中的key作为列索引,创建了3*3的DataFrame表格二维数组
df1 = pd.DataFrame(data={'python':[99,107,122],'math':[111,137,88],'En':[68,108,43]},# key作为列索引index=['张三','李四','jayden'])# index作为行索引
df2 = pd.DataFrame(data=np.random.randint(0,151,size=(5,3)),index = ['Danial','Brandon','softpo','Ella','Cindy'], # 行索引columns=['Python','Math','En']) # 列索引

3 数据查看

可以DataFrame的常用属性和DataFrame的概览和统计信息

import numpy as np
import pandas as pd # 创建 shape(150,3)的二维标签数组结构DataFrame
df = pd.DataFrame(data = np.random.randint(0,151,size = (150,3)), index = None,# 行索引默认 columns=['Python','Math','En'])# 列索引
# 查看其属性、概览和统计信息
df.head(10) # 显示头部10行,默认5个
df.tail(10) # 显示末尾10行,默认5个
df.shape # 查看形状,行数和列数
df.dtypes # 查看数据类型
df.index # 行索引
df.columns # 列索引
df.values # 对象值,二维ndarray数组
df.describe() # 查看数值型列的汇总统计,计数、平均值、标准差、最小值、四分位数、最大值
df.info() # 查看列索引、数据类型、非空计数和内存信息

4 数据输入和输出

4.1 csv文件的输入和输出

import numpy as np
import pandas as pddf = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪资情况columns=['IT','化工','生物','教师','士兵'])
# 保存到当前路径下,文件命名是:salary.csv。csv逗号分割值文件格式
df.to_csv("./salary.csv",sep=';', # 文本分隔符,默认是逗号header = True, # 是否保存列索引index = True)  # 是否保存行索引,保存行索引,文件被加载时,默认行索引会作为一列
# 加载
pd.read_csv("./salary.csv",sep=';', # 默认是逗号header = [0], # 指定列索引index_col=0) # 指定行索引
pd.read_table('./salary.csv', # 和read_csv类似,读取限定分隔符的文本文件sep = ';', header = [0],#指定列索引 index_col=0) # 指定行索引,IT作为行索引

4.2 Excel文件的输入和输出

首先要安装专门处理Excel的库(在当前python环境中安装)

pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install openpyxl
import numpy as np
import pandas as pddf1 = pd.DataFrame(data=np.random.randint(0,50,size=(50,5)),# 薪资情况columns=('IT','化工','生物','教师','士兵'))
df2 = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 计算机科目的考试columns=['Python','Tensorflow','Keras'])
# 保存到当前路径下,文件命名是:salary.xls
df1.to_excel("./salary.xls",sheet_name='salary', # Excel中工作表的名字header = True, # 是否保存列索引index = False) # 是否保存行索引,保存行索引
pd.read_excel('./salary.xls', sheet_name=0,# 读取哪一个Excel中工作表,默认第一个 header = 0,# 使用第一行数据作为列索引 names = list('ABCDE'),# 替换行索引 index_col=1)# 指定行索引,B作为行索引
# 一个Excel文件中保存多个工作表
with pd.ExcelWriter('./data.xls') as writer:df1.to_excel(writer,sheet_name='salary',index=False)df2.to_excel(writer,sheet_name='score',index=False)
# 注意: 貌似不支持读取xlsx
pd.read_excel('./data.xls', sheet_name='salary') # 读取Excel中指定名字的工作表

4.3 SQL的读取

pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple


数据库引擎配置:https://docs.sqlalchemy.org/en/13/core/engines.html

import pandas as pd
# SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具
from sqlalchemy import create_enginedf = pd.DataFrame(data=np.random.randint(0,50,size=[150,3]), # 计算机科目的考试成 绩columns=['Python','Tensorflow','Keras'])
# 数据库连接
conn = create_engine('mysql+pymysql://root:root@localhost/pandas?charset=UTF8MB4')
# 保存到数据库
df.to_sql('score',#数据库中表名conn,# 数据库连接if_exists='append')#如果表名存在,追加数据
# 从数据库中加载
pd.read_sql('select * from score limit 10', # sql查询语句conn,# 数据库连接index_col='Python')# 指定行索引名

4.4 HDF5

pip install tables -i https://pypi.tuna.tsinghua.edu.cn/simple
  • HDF5是一个独特的技术套件,可以管理非常大和复杂的数据收集。
  • HDF5,可以存储不同类型数据的文件格式,后缀通常是.h5,它的结构是层次性的。
  • 一个HDF5文件可以被看作是一个组包含了各类不同的数据集。
  • 对于HDF5文件中的数据存储,有两个核心概念:group 和 dataset。
  • dataset 代表数据集,一个文件当中可以存放不同种类的数据集,这些数据集如何管理,就用到了group
    最直观的理解,可以参考我们的文件管理系统,不同的文件位于不同的目录下。
  • 目录就是HDF5中的group, 描述了数据集dataset的分类信息,通过group 有效的将多种dataset 进行管
    理和区分;文件就是HDF5中的dataset, 表示的是具体的数据。
import numpy as np
import pandas as pd
df1 = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪资情况 columns=['IT','化工','生物','教师','士兵'])
df2 = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 计算机科目的考试 成绩 columns=['Python','Tensorflow','Keras'])
# 保存到当前路径下,文件命名是:data.h5
df1.to_hdf('./data.h5',key='salary') # 保存数据的key,标记
df2.to_hdf('./data.h5',key = 'score')
pd.read_hdf('./data.h5', key = 'salary')#获取指定的标记、key的数据

5 数据选取

5.1 字段选择

import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.random.randint(0,150,size=[150,3]), # 计算机科目的考试 成绩columns=['Python','Tensorflow','Keras'])
df['Python']  # 获取单列,Series
df.Python # 获取单列,Series
df[['Python','Keras']] # 获取多列,DataFrame
df[3:15] # 行切片

5.2 标签选择

import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试成 绩 index = list('ABCDEFGHIJ'),# 行标签 columns=['Python','Tensorflow','Keras'])
df.loc[['A','C','D','F']]# 选取指定行标签数据。
df.loc['A':'E',['Python','Keras']] # 根据行标签切片,选取指定列标签的数据
df.loc[:,['Keras','Tensorflow']] # :默认保留所有行
df.loc['E'::2,'Python':'Tensorflow'] # 行切片从标签E开始每2个中取一个,列标签进行切片
df.loc['A','Python'] # 选取标量值

5.3 位置选择

import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试成 绩 index = list('ABCDEFGHIJ'),# 行标签 columns=['Python','Tensorflow','Keras'])
df.iloc[4] # 用整数位置选择第4行的数据。
df.iloc[4]
df.iloc[2:8,0:2] # 用整数切片,类似NumPy
df.iloc[[1,3,5],[0,2,1]] # 整数列表按位置切片
df.iloc[1:3,:] # 行切片
df.iloc[:,:2] # 列切片
df.iloc[0,2] # 选取标量值

5.4 booleanx索引

import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试成 绩 index = list('ABCDEFGHIJ'),# 行标签,用户columns=['Python','Tensorflow','Keras']) # 考试科目
cond1 = df.Python > 100 # 判断Python分数是否大于100,返回值是boolean类型的Series
df[cond1]  # 返回Python分数大于100分的用户所有考试科目数据
cond2 = (df.Python > 50) & (df['Keras'] > 50) # &与运算
df[cond2] # 返回Python和Keras同时大于50分的用户的所有考试科目数据
df[df > 50]# 选择DataFrame中满足条件的值,如果满足返回值,不然返回空数据NaN
df[df.index.isin(['A','C','F','Z'])] # isin判断是否在数组中,返回也是boolean类型值

5.5 赋值操作

import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试成 绩 index = list('ABCDEFGHIJ'),# 行标签,用户columns=['Python','Tensorflow','Keras']) # 考试科目
s = pd.Series(data = np.random.randint(0,150,size = 9),index=list('BCDEFGHIJ'),name = 'PyTorch')
df['PyTorch'] = s # 增加一列,DataFrame行索引自动对齐
df.loc['A','Python'] = 256 # 按标签赋值
df.iloc[3,2] = 512 # 按位置赋值
df.loc[:,'Python'] = np.array([128]*10) # 按NumPy数组进行赋值
df[df >= 128] = -df # 按照where条件进行赋值,大于等于128变成原来的负数,否则不变

6 数据集成

pandas 提供了多种将 Series、DataFrame 对象组合在一起的功能

6.1 concat数据串联

import pandas as pd
import numpy as np
df1 = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试 成绩 index = list('ABCDEFGHIJ'),# 行标签,用户 columns=['Python','Tensorflow','Keras']) # 考试科目
df2 = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科目的考试 成绩 index = list('KLMNOPQRST'),# 行标签,用户 columns=['Python','Tensorflow','Keras']) # 考试科目
df3 = pd.DataFrame(data = np.random.randint(0,150,size = (10,2)), index = list('ABCDEFGHIJ'), columns=['PyTorch','Paddle'])
pd.concat([df1,df2],axis = 0) # df1和df2行串联,df2的行追加df2行后面
df1.append(df2) # 在df1后面追加df2
pd.concat([df1,df3],axis = 1) # df1和df2列串联,df2的列追加到df1列后面

6.2 在列表中插入一列数据

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)), index = list('ABCDEFGHIJ'), columns = ['Python','Keras','Tensorflow'])
df.insert(loc = 1,column='Pytorch',value=1024) # 插入列
df# 对行的操作,使用追加append,默认在最后面,无法指定位置 # 如果想要在指定位置插入行:切割-添加-合并

6.3 Join SQL风格合并

数据集的合并(merge)或连接(join)运算是通过一个或者多个键将数据链接起来的。这些运算是关系型数据库的核心操作。pandas的merge函数是数据集进行join运算的主要切入点。

import numpy as np
import pandas as pd
# 表一中记录的是name和体重信息
df1 = pd.DataFrame(data={'name':['softpo','Daniel','Brandon','Ella'],'weight': [70,55,75,65]})
# 表二中记录的是name和身高信息
df2 = pd.DataFrame(data={'name':['softpo','Danie','Brandon','Cindy'],'height':[172,170,170,166]})
df3 = pd.DataFrame(data = {'名字':['softpo','Daniel','Brandon','Cindy'],'height': [172,170,170,166]})
# 根据共同的name将俩表的数据,进行合并
pd.merge(df1,df2, how = 'inner',# 内合并代表两对象交集 on = 'name')
pd.merge(df1,df3, how = 'outer',# 全外连接,两对象并集 left_on = 'name',# 左边DataFrame使用列标签 name进行合并 right_on = '名字')# 右边DataFrame使用列标签 名字进行合并# 创建10名学生的考试成绩
df4 = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)), index = list('ABCDEFHIJK'), columns=['Python','Keras','Tensorflow'])
# 计算每位学生各科平均分,转换成DataFrame
score_mean = pd.DataFrame(df4.mean(axis = 1).round(1),columns=['平均分'])
# 将平均分和df3使用merge进行合并,它俩有共同的行索引
pd.merge(left = df4,right = score_mean, left_index=True,# 左边DataFrame使用行索引进行合并 right_index=True)# 右边的DataFrame使用行索引进行合并

7 数据清洗

import numpy as np
import pandas as pddf = pd.DataFrame(data={'color':['red','blue','red','green','blue',None,'red'],'price':[10,20,10,15,20,0,np.NaN]})
# 1、重复数据过滤
df.duplicated() # 判断是否存在重复数据
df.drop_duplicates() # 删除重复数据# 2、空数据过滤
df.isnull() # 判断是否存在空数据,存在返回True,否则返回False
df.dropna(how = 'any') # 删除空数据
df.fillna(value=1111) # 填充空数据# 3、指定行或者列过滤
del df['color'] # 直接删除某列
df.drop(labels = ['price'],axis = 1)# 删除指定列
df.drop(labels = [0,1,5],axis = 0) # 删除指定行# 4、函数filter使用
df = pd.DataFrame(np.array(([3,7,1], [2, 8, 256])), index=['dog', 'cat'], columns=['China', 'America', 'France'])
df.filter(items=['China', 'France'])
# 根据正则表达式删选列标签
df.filter(regex='a$', axis=1)
# 选择行中包含og
df.filter(like='og', axis=0)# 5、异常值过滤
df2 = pd.DataFrame(data = np.random.randn(10000,3)) # 正态分布数据# 3σ过滤异常值,σ即是标准差
cond = (df2 > 3*df2.std()).any(axis = 1)
index = df2[cond].index # 不满足条件的行索引
df2.drop(labels=index,axis = 0) # 根据行索引,进行数据删除

8 数据转化

8.1 轴和元素替换

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)), index = list('ABCDEFHIJK'), columns=['Python','Tensorflow','Keras'])
df.iloc[4,2] = None # 空数据
#1、重命名轴索引
df.rename(index = {'A':'AA','B':'BB'},columns = {'Python':'人工智能'})
# 2、替换值
df.replace(3,1024) #将3替换为1024
df.replace([0,7],2048) # 将0和7替换为2048
df.replace({0:512,np.nan:998}) # 根据字典键值对进行替换
df.replace({'Python':2},-1024) # 将Python这一列中等于2的,替换为-1024

8.2 map Series 元素改变

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)), index = list('ABCDEFHIJK'), columns=['Python','Tensorflow','Keras']) df.iloc[4,2] = None # 空数据
# 1、map批量元素改变,Series专有
df['Keras'].map({1:'Hello',5:'World',7:'AI'}) # 如果Keras这一列中有值为1的,那么更改为Hello,字典映射
df['Python'].map(lambda x:True if x >=5 else False) # 隐式函数映射
def convert(x): # 显示函数映射 if x%3 == 0: return True elif x%3 == 1: return False
df['Tensorflow'].map(convert)

8.3 apply元素改变

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)), index = list('ABCDEFHIJK'), columns=['Python','Tensorflow','Keras'])
df.iloc[4,2] = None # 空数据
# 1、apply 应用方法数据转换,通用
# Series,其中x是Series中元素
df['Keras'].apply(lambda x:True if x >5 else False)
# DataFrame,其中的x是DataFrame中列或者行,是Series
df.apply(lambda x : x.median(),axis = 0) # 列的中位数
def convert(x): # 自定义方法 return (x.mean().round(1),x.count())
df.apply(convert,axis = 1) # 行平均值,计数 # 2、applymap DataFrame专有
df.applymap(lambda x : x + 100) # 计算DataFrame中每个元素

8.4 transform变形金刚

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)), index = list('ABCDEFHIJK'), columns=['Python','Tensorflow','Keras'])
df.iloc[4,2] = None # 空数据
# 1、一列执行多项计算
df['Python'].transform([np.sqrt,np.exp]) # Series处理 对Python这一列每个值进行开平方根和e*x
def convert(x): if x.mean() > 5: x *= 10 else:x *= -10 return x
# 2、多列执行不同计算
df.transform({'Python':convert,'Tensorflow':np.max,'Keras':np.min}) # DataFrame处理

8.5 重排随机抽样、哑变量

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)), index = list('ABCDEFHIJK'), columns=['Python','Tensorflow','Keras'])
ran = np.random.permutation(10) # 随机重排
df.take(ran) # 重排DataFrame
df.take(np.random.randint(0,10,size = 15)) # 随机抽样 # 哑变量,one-hot独热编码,1表示有,0表示没有
df = pd.DataFrame({'key':['b','b','a','c','a','b']})
pd.get_dummies(df,prefix='',prefix_sep='')

9 数据重塑

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,100,size = (10,3)),index = list('ABCDEFHIJK'),columns = ['Python','Tensorflow','Keras'])
df.T # 转置
df2 = pd.DataFrame(data=np.random.randint(0,100,size=(20,3)),index = pd.MultiIndex.from_product([list('ABCDEFHIJK'),['期中','期末']]), #多层索引columns = ['Python','Tensorflow','Keras'])
df2.unstack(level = -1) # 行旋转成列,level指定哪一层,进行变换(期中等行 变成列)
df2.stack() # 列旋转成行(Python等列 直接放放到行中)
df2.stack().unstack(level = 1) # 行列互换(Python等列 和 期中等行 交换)# 多层索引DataFrame数学计算
df2
df2.mean() # 各学科平均分
df2.mean(level=0) # 各学科,每个人期中期末平均分
df2.mean(level = 1) # 各学科,期中期末所有人平均分

10 数学和统计方法

pandas对象拥有一组常用的数学和统计方法。它们属于汇总统计,对Series汇总计算获取mean、max
值或者对DataFrame行、列汇总计算返回一个Series。

import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,100,size = (20,3)), index = list('ABCDEFHIJKLMNOPQRSTU'), columns=['Python','Tensorflow','Keras'])
# 1、简单统计指标
df.count() # 非NA值的数量,没有指明axis默认0
df.max(axis = 0) #轴0最大值,即每一列最大值
df.min() #默认计算轴0最小值
df.median() # 中位数
df.sum()# 求和
df.mean(axis = 1) #轴1平均值,即每一行的平均值
df.quantile(q = [0.2,0.4,0.8]) # 分位数
df.describe() # 查看数值型列的汇总统计,计数、平均值、标准差、最小值、四分位数、最大值# 2、索引位置
df['Python'].argmin() # 计算最小值位置
df['Keras'].argmax() # 最大值位置
df.idxmax() # 最大值索引标签
df.idxmin() # 最小值索引标签# 3、更多统计指标
df['Python'].value_counts() # 统计元素出现次数
df['Keras'].unique() # 去重
df.cumsum() # 累加
df.cumprod() # 累乘
df.std() # 标准差
df.var() # 方差
df.cummin() # 累计最小值
df.cummax() # 累计最大值
df.diff() # 计算差分
df.pct_change() # 计算百分比变化# 4、高级统计指标
df.cov() # 属性的协方差
df['Python'].cov(df['Keras']) # Python和Keras的协方差
df.corr() # 所有属性相关性系数
df.corrwith(df['Tensorflow']) # 单一属性相关性系数

11 数据排序

import numpy as np
import pandas as pddf = pd.DataFrame(data=np.random.randint(0,30,size=(30,3)),index= list('qwertyuioijhgfcasdcvbnerfghjcf'),columns = ['Python','Keras','Pytorch'])
# 1、索引列名排序
df.sort_index(axis = 0 , ascending=True) # 按索引排序,降序
df.sort_index(axis = 1,ascending=False) #按列名排序,升序
# 2、属性值排序
df.sort_values(by = ['Python']) #按Python属性值排序
df.sort_values(by = ['Python','Keras'])#先按Python,再按Keras排序
# 3、返回属性n大或者n小的值
df.nlargest(10,columns='Keras') # 根据属性Keras排序,返回最大10个数据
df.nsmallest(5,columns='Python') # 根据属性Python排序,返回最小5个数据

12 分箱操作

  • 分箱操作就是将连续数据转换为分类对应物的过程。比如将连续的身高数据划分为:矮中高。
  • 分箱操作分为等距分箱等频分箱
  • 分箱操作也叫面元划分或者离散化
import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,150,size = (6,3)), columns=['Python','Tensorflow','Keras'])
# 1、等宽分箱 #找到Python的最小值和最大值,然后除以3,分成三类,然后指定每一个值属于哪一类
pd.cut(df.Python,bins = 3) # 指定宽度分箱
pd.cut(df.Keras,#分箱数据 bins = [0,60,90,120,150],#分箱断点 right = False,# 左闭右开 labels=['不及格','中等','良好','优秀'])# 分箱后分类
# 2、等频分箱
pd.qcut(df.Python,q = 4,# 4等分 labels=['差','中','良','优']) # 分箱后分类

13 分组聚合

13.1 分组和聚合

import numpy as np
import pandas as pd
# 准备数据
df = pd.DataFrame(data={'sex':np.random.randint(0,2,size=300), # 0男,1女'class':np.random.randint(1,9,size=300), #1~8八个班'Python':np.random.randint(0,151,size = 300),#Python成 绩'Keras':np.random.randint(0,151,size =300),#Keras成绩 'Tensorflow':np.random.randint(0,151,size=300), 'Java':np.random.randint(0,151,size = 300), 'C++':np.random.randint(0,151,size = 300)
})
df
df['sex'] = df['sex'].map({0:'男',1:'女'}) # 将0,1映射成男女
df
# 1、分组->可迭代对象 # 1.1 先分组再获取数据
g = df.groupby(by = 'sex') [['Python','Java']]# 单分组 g = df.groupby(by = ['class','sex'])[['Python']] # 多分组# 1.2 对一列值进行分组
g = df['Python'].groupby(df['class']) # 单分组
g = df[['Keras','Python']].groupby([df['class'],df['sex']]) # 多分组# 1.3 按数据类型分组
g = df.groupby(df.dtypes,axis = 1)
for name,data in g: print('组名:',name) print('数据:',data)# 1.4 通过字典进行分组
m = {'sex':'category','class':'category','Python':'IT','Keras':'IT','Tensorflow':'IT','Java':'IT','C++':'IT'}
for name,data in df.groupby(m,axis = 1): print('组名',name) print('数据',data)# 2、分组直接调用函数进行聚合 # 按照性别分组,其他列均值聚合
df.groupby(by = 'sex').mean().round(1) # 保留1位小数# 按照班级和性别进行分组,Python、Keras的最大值聚合
df.groupby(by = ['class','sex'])[['Python','Keras']].max()# 按照班级和性别进行分组,计数聚合。统计每个班,男女人数
df.groupby(by = ['class','sex']).size()# 基本描述性统计聚合
df.groupby(by = ['class','sex']).describe()

13.2 分组聚合apply、transform


# 3、分组后调用apply,transform封装单一函数计算
# 返回分组结果
df.groupby(by = ['class','sex'])[['Python','Keras']].apply(np.mean).round(1)
def normalization(x): return (x - x.min())/(x.max() - x.min()) # 最大值最小值归一化
# 返回全数据,返回DataFrame.shape和原DataFrame.shape一样。
df.groupby(by = ['class','sex']) [['Python','Tensorflow']].transform(normalization).round(3)

13.3 分组聚合agg

# 4、agg 多中统计汇总操作
# 分组后调用agg应用多种统计汇总
df.groupby(by = ['class','sex']) [['Tensorflow','Keras']].agg([np.max,np.min,pd.Series.count])
# 分组后不同属性应用多种不同统计汇总
df.groupby(by = ['class','sex'])[['Python','Keras']].agg({'Python':[('最大 值',np.max),('最小值',np.min)], 'Keras':[('计 数',pd.Series.count),('中位数',np.median)]})

13.4 透视表 pivot-table

# 5、透视表
# 透视表也是一种分组聚合运算
def count(x): return len(x)
df.pivot_table(values=['Python','Keras','Tensorflow'],# 要透视分组的值 index=['class','sex'], # 分组透视指标 aggfunc={'Python':[('最大值',np.max)], # 聚合运算 'Keras':[('最小值',np.min),('中位数',np.median)], 'Tensorflow':[('最小值',np.min),('平均值',np.mean),('计 数',count)]})

14 时间序列

14.1 时间戳操作

import numpy as np
import pandas as pd
# 1、创建方法
pd.Timestamp('2020-8-24 12')# 时刻数据
pd.Period('2020-8-24',freq = 'M') # 时期数据
index = pd.date_range('2020.08.24',periods=5,freq = 'M') # 批量时刻数据
index
pd.period_range('2020.08.24',periods=5,freq='M') # 批量时期数据
ts = pd.Series(np.random.randint(0,10,size = 5),index = index) # 时间戳索引Series
ts# 2、转换方法
pd.to_datetime(['2020.08.24','2020-08-24','24/08/2020','2020/8/24'])
pd.to_datetime([1598582232],unit='s') # 将时间戳变成以秒为最小计数的时间
dt = pd.to_datetime([1598582420401],unit = 'ms') # 世界标准时间
dt
dt + pd.DateOffset(hours = 8) # 东八区时间
dt + pd.DateOffset(days = 100) # 100天后日期

14.2 时间戳索引

import numpy as np
import pandas as pd
index = pd.date_range("2020-8-24", periods=200, freq="D")
ts = pd.Series(range(len(index)), index=index)
# str类型索引
ts['2020-08-30'] # 日期访问数据
ts['2020-08-24':'2020-09-3'] # 日期切片
ts['2020-08'] # 传入年月 ts['2020'] # 传入年
# 时间戳索引
ts[pd.Timestamp('2020-08-30')]
ts[pd.Timestamp('2020-08-24'):pd.Timestamp('2020-08-30')] # 切片
ts[pd.date_range('2020-08-24',periods=10,freq='D')] # 时间戳索引属性
ts.index.year # 获取年
ts.index.dayofweek # 获取星期几
ts.index.weekofyear # 一年中第几个星期几

14.3 时间序列常用方法

在做时间序列相关的工作时,经常要对时间做一些移动/滞后、频率转换、采样等相关操作,我们来看下
这些操作如何使用。

import numpy as np
import pandas as pd
index = pd.date_range('8/1/2020', periods=365, freq='D')
ts = pd.Series(np.random.randint(0, 500, len(index)), index=index)
# 1、移动
ts.shift(periods = 2) # 数据后移
ts.shift(periods = -2) # 数据前移
# 日期移动
ts.shift(periods = 2,freq = pd.tseries.offsets.Day()) # 天移动
# ts.tshift(periods = 1,freq = pd.tseries.offsets.MonthOffset()) #月移动# 2、频率转换
ts.asfreq(pd.tseries.offsets.Week()) # 天变周
ts.asfreq(pd.tseries.offsets.MonthEnd()) # 天变月
ts.asfreq(pd.tseries.offsets.Hour(),fill_value = 0) #天变小时,由少变多,fill_value 为填充值# 3、重采样
# resample 表示根据日期维度进行数据聚合,可以按照分钟、小时、工作日、周、月、年等来作为日期维度
ts.resample('2W').sum() # 以2周为单位进行汇总
ts.resample('3M').sum().cumsum() # 以季度为单位进行汇总ts# 4、DataFrame重采样
d = dict({'price': [10, 11, 9, 13, 14, 18, 17, 19], 'volume': [50, 60, 40, 100, 50, 100, 40, 50], 'week_starting':pd.date_range('24/08/2020',periods=8,freq='W')})
df1 = pd.DataFrame(d)
df1.resample('M',on = 'week_starting').apply(np.sum)
df1.resample('M',on = 'week_starting').agg({'price':np.mean,'volume':np.sum}) days = pd.date_range('1/8/2020', periods=4, freq='D')
data2 = dict({'price': [10, 11, 9, 13, 14, 18, 17, 19], 'volume': [50, 60, 40, 100, 50, 100, 40, 50]})
df2 = pd.DataFrame(data2, index=pd.MultiIndex.from_product([days, ['morning','afternoon']]))
df2.resample('D', level=0).sum()

14.4 时区表示

import numpy as np
import pandas as pd
import pytz index = pd.date_range('8/1/2012 00:00', periods=5, freq='D')
ts = pd.Series(np.random.randn(len(index)), index) pytz.common_timezones # 常用时区
# 时区表示
ts = ts.tz_localize(tz='UTC')
# 转换成其它时区
ts.tz_convert(tz = 'Asia/Shanghai')

15 数据可视化

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

因为jupyter notebook 内置了matplotlib,所以只要下载了包就可以使用,不用再导入包了

import numpy as np
import pandas as pd# 1、线形图
df1 = pd.DataFrame(data=np.random.randn(1000,4),index= pd.date_range(start='27/6/2012',periods=1000),columns=list('ABCD'))
df1.cumsum().plot()# 2、条形图
df2 = pd.DataFrame(data = np.random.rand(10,4), columns = list('ABCD'))
df2.plot.bar(stacked = True) # stacked 是否堆叠# 3、饼图
df3 = pd.DataFrame(data = np.random.rand(4,2), index = list('ABCD'), columns=['One','Two'])
df3.plot.pie(subplots = True,figsize = (8,8))# 4、散点图
df4 = pd.DataFrame(np.random.rand(50, 4), columns=list('ABCD'))
df4.plot.scatter(x='A', y='B') # A和B关系绘制
# 在一张图中绘制AC散点图,同时绘制BD散点图
ax = df4.plot.scatter(x='A', y='C', color='DarkBlue', label='Group 1');
df4.plot.scatter(x='B', y='D', color='DarkGreen', label='Group 2', ax=ax)
# 气泡图,散点有大小之分
df4.plot.scatter(x='A',y='B',s = df4['C']*200)# 5、面积图
df5 = pd.DataFrame(data = np.random.rand(10, 4), columns=list('ABCD'))
df5.plot.area(stacked = True);# stacked 是否堆叠# 6、箱式图
df6 = pd.DataFrame(data = np.random.rand(10, 5), columns=list('ABCDE'))
df6.plot.box()# 7、直方图
df7 = pd.DataFrame({'A': np.random.randn(1000) + 1, 'B': np.random.randn(1000), 'C': np.random.randn(1000) - 1})
df7.plot.hist(alpha=0.5) #带透明度直方图
df7.plot.hist(stacked = True)# 堆叠图
df7.hist(figsize = (8,8)) # 子视图绘制

如果是使用pycharm等编辑器来使用matplotlib,则只需稍稍改变,导入包即可

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 1、线形图
df1 = pd.DataFrame(data=np.random.randn(1000,4),index= pd.date_range(start='27/6/2012',periods=1000),columns=list('ABCD'))
df1 = df1.cumsum()
plt.plot(df1)
plt.show()

16 pandas总结

  • 一个快速、高效的DataFrame对象,用于数据操作综合索引
  • 可以用于在内存数据结构和不同格式之间读写数据的工具:CSV和txt文本文件、Microsoft Excel、SQL数据库和快速HDF5格式;
  • 智能数据对齐丢失数据的综合处理:在计算中获得基于标签的自动对齐,并轻松地将凌乱的数据操作为有序的形式;
  • 数据集的灵活调整旋转
  • 基于智能标签的切片、花式索引和大型数据集的子集
  • 可以从数据结构中插入和删除列,以实现大小可变;
  • 通过在强大的引擎中聚合转换数据,允许对数据集进行拆分应用组合操作;
  • 数据集的高性能合并连接
  • 层次轴索引提供了在低维数据结构中处理高维数据的直观方法;
  • 时间序列-功能:日期范围生成和频率转换、移动窗口统计、移动窗口线性回归、日期转换和滞后。甚至在不丢失数据的情况下创建特定领域的时间偏移和加入时间序列;
  • 性能进行了高度优化,用Cython或C编写了关键代码路径。
  • Python与pandas在广泛的学术和商业领域中使用,包括金融,神经科学,经济学,统计学,广告,网络分析,等等
  • 学到这里,体会一会pandas库的亮点,如果对哪些还不熟悉,请对之前知识点再次进行复习。

Pandas数据分析库(2)Python数据分析相关推荐

  1. python数据分析要学什么_python数据分析学什么?python数据分析入门

    有很多没有基础的新手想学习python数据分析,却在纠结python数据分析难不难学?下面万古网校小编给大家整理了资料,为各位分享! 1.python难不难? Python可以说是目前比较主流而且易学 ...

  2. python 数据分析学什么-python数据分析学什么?python数据分析入门

    有很多没有基础的新手想学习python数据分析,却在纠结python数据分析难不难学?下面万古网校小编给大家整理了资料,为各位分享! 1.python难不难? Python可以说是目前比较主流而且易学 ...

  3. 【数据分析入门】python数据分析全过程梳理与代码实现

    文章目录 数据分析 数据获取 探索分析与可视化 预处理理论 分析建模 评估模型 数据分析 数据获取 [数据分析入门]python数据分析之数据获取方法 探索分析与可视化 [数据分析入门]python数 ...

  4. 【Python学习】 - 超详细的零基础Pandas学习(附Python数据分析与应用课本第四章实训答案)

    (博文体系参考:<Python数据分析与应用>课本) 任务数据如下: 读入csv文件时,encoding必须是正确的,常用的编码格式有:UTF-8 , UTF-16 , GBK , GB2 ...

  5. 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 扫描版

    给大家带来的一篇关于数据挖掘相关的电子书资源,介绍了关于Python.数据分析.数据挖掘方面的内容,本书是由清华大学出版社出版,格式为PDF,资源大小67.8 MB,刘顺祥编写,目前豆瓣.亚马逊.当当 ...

  6. 如何自学python数据分析-『』python数据分析该怎么入门呢?

    用python学数据分析难吗? 数据方向的薪资待遇还是比较高的,而且趋势也比较明显.随着据的落地应用,数据分析将有广泛的发展前景,未来广大的传统行业也将陆续释放出大量的数据分析岗位 通过Python来 ...

  7. python数据分析可视化实例-Python数据分析与可视化从入门到精通

    (1)没有高深理论,每章都以实例为主,读者参考书中源码运行,就能得到与书中一样的结果.(2)专注于Python数据分析与可视化操作中实际用到的技术.相比大而全的书籍资料,本书能让读者尽快上手,开始项目 ...

  8. 数据分析系列之Python数据分析简介

    Python是一门简单易学且功能强大的编程语言,使其在许多领域成为编写脚本或开发应用程序理想语言 .Python被称作"胶水语言",是由于其运行效率的问题,将程序核心部分由C++等 ...

  9. python 数据分析学什么-python数据分析哪些课程好?

    目前数据分析.机器学习的应用如火如荼,许多同学都有意参与到这股学习的热潮中来,但是令人苦恼的是,学习资料有很多,但是常常感觉无从下手. 这是因为,这里所涉及到的数据科学是一个综合学科,想掌握他需要熟练 ...

  10. python数据分析实战案例-Python数据分析案例实战

    原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...

最新文章

  1. 数据结构Java实现03----单向链表的插入和删除b
  2. Objective-c 字符串的拼接
  3. 在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...
  4. 磊哥最近面试了好多人,聊聊我的感受!(附面试知识点)
  5. 《黑客帝国》中的代码雨让人身临其境!利用Python轻松实现!
  6. 25% 的开发者认为 Rust 是最佳替代,最新 Go 开发者调查报告出炉
  7. perl first day
  8. 服务器查看数据库日志文件,服务器数据库查看日志文件
  9. c语言五子棋中怎么设置开局,五子棋教程:指定开局
  10. centos查看内存使用最多_CentOs中查看内存插槽数、最大容量和频率 查看内存插槽数、最大容量和频率...
  11. 如何用java POI在excel中画线_Java中使用POI在Excel单元格中画斜线—XLS格式
  12. mysql backup 使用_MYSQLBACKUP工具的使用
  13. 背包问题(最大装载价值)
  14. 华为python673集_[译] 使用 Python 的 Pandas 和 Seaborn 框架从 Kaggle 数据集中提取信息...
  15. Born to Win: Find Your Success Code by Zig Ziglar and Tom Ziglar
  16. ANDROID内存优化(大汇总——全)
  17. misc中文件无扩展名修复
  18. 执行宏时出现“在中断模式不能执行程序代码”
  19. RK3568开发笔记-EDP显示屏接口调试记录
  20. linux invalid argument_Linux | 那些年学习Linux你被坑过的故障集合

热门文章

  1. java多线程应用场景
  2. 蓝牙路由器蓝牙点对多点组网蓝牙远程控制
  3. linux 开放5222端口,XMPP协议、IM、客户端互联详解
  4. 经纬度---(所有、江苏)
  5. FMX和VCL混用时RegisterClass无法GetClass或FindClass的问题
  6. 解决无公网IP,远程访问黑群晖NAS
  7. 芯盾时代人工智能全渠道业务安全防护方案:提供“业务+平台+建模服务”为核心的多场景反欺诈服务| 百万人学AI评选
  8. 对创业团队的一点想法
  9. SpringBoot+Vue项目毕业论文管理系统
  10. pandas中强大的绘制图表功能——DataFrame.hist(),以及统计分析函数——DataFrame.describe()