当前位置: 首页 > article >正文

Pandas 数据分析入门详解

今日内容大纲介绍
  • DataFrame读写文件

  • DataFrame加载部分数据

  • DataFrame分组聚合计算

  • DataFrame常用排序方式


1.DataFrame-保存数据到文件
  • 格式

    df对象.to_数据格式(路径)
    ​
    # 例如:
    df.to_csv('data/abc.csv')

  • 代码演示

    如要保存的对象是计算的中间结果,或者以后会在Python中复用,推荐保存成pickle文件

    如果保存成pickle文件,只能在python中使用, 文件的扩展名可以是.p,.pkl,.pickl

    # output文件夹必须存在
    df.to_pickle('output/scientists.pickle')                         # 保存为 pickle文件 
    df.to_csv('output/scientists.csv')                               # 保存为 csv文件     
    df.to_excel('output/scientists.xlsx')                             # 保存为 Excel文件 
    df.to_excel('output/scientists_noindex.xlsx', index=False)        # 保存为 Excel文件 
    df.to_csv('output/scientists_noindex.csv', index=False)           # 保存为 Excel文件 
    df.to_csv('output/scientists_noindex.tsv', index=False, sep='\t') 
    ​
    print('保存成功')

  • 注意, pandas读写excel需要额外安装如下三个包

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlwt 
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd

2.DataFrame-读取文件数据
  • 格式

    pd对象.read_数据格式(路径)
    ​
    # 例如:
    pd.read_csv('data/movie.csv')

  • 代码演示

    # pd.read_pickle('output/scientists.pickle')  # 读取Pickle文件中的内容
    # pd.read_excel('output/scientists.xlsx')     # 多1个索引列
    # pd.read_csv('output/scientists.csv')        # 多1个索引列
    ​
    pd.read_csv('output/scientists_noindex.csv')  # 正常数据

3.DataFrame-数据分析入门
  • 回顾 DataFrameSeries概念

    • Pandas是用于数据分析的开源Python库,可以实现数据加载,清洗,转换,统计处理,可视化等功能

    • DataFrame和Series是Pandas最基本的两种数据结构

    • DataFrame用来处理结构化数据(SQL数据表,Excel表格)

    • Series用来处理单列数据,也可以把DataFrame看作由Series对象组成的字典或集合

  • 按列加载数据

    做数据分析首先要加载数据,并查看其结构和内容,对数据有初步的了解 查看行,列数据分布情况 查看每一列中存储信息的类型

    import pandas as pd
    ​
    # 1. 加载数据
    df = pd.read_csv('data/gapminder.tsv', sep='\t')    # 指定切割符为\t
    df.head()
    ​
    # 2. # 查看df类型
    type(df)
    df.shape        # (1704, 6)
    df.columns      # Index(['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap'], dtype='object')
    df.index        # RangeIndex(start=0, stop=1704, step=1)
    df.dtypes       # 查看df对象 每列的数据类型
    df.info()       # 查看df对象 详细信息
    ​
    ​
    # 3. 加载一列数据
    # country_series = df['country']
    country_series = df.country     # 效果同上
    country_series.head()           # 查看前5条数据
    # 细节: 如果写 df['country'] 则是Series对象, 如果写 df[['country']]则是df对象
    ​
    ​
    # 4. 加载多列数据
    subset = df[['country', 'continent', 'year']]    # df对象
    print(subset.tail())

  • 按行加载数据

    # 1. 按行加载数据
    df.head()       # 获取前5条, 最左侧是一列行号, 也是 df的行索引, 即: Pandas默认使用行号作为 行索引.
    ​
    # 2. 使用 tail()方法, 获取最后一行数据
    df.tail(n=1)
    ​
    # 3. 演示 iloc属性 和 loc属性的区别,  loc属性写的是: 行索引值.  iloc写的是行号.
    df.tail(n=1).loc[1703]
    df.tail(n=1).iloc[0]        # 效果同上.
    ​
    # 4. loc属性 传入行索引, 来获取df的部分数据(一行, 或多行)
    df.loc[0]       # 获取 行索引为 0的行
    df.loc[99]      # 获取 行索引为 99的行
    df.loc[[0, 99, 999]]    # loc属性, 根据行索引值, 获取多条数据.
    ​
    # 5. 获取最后一条数据
    # df.loc[-1]          # 报错
    df.iloc[-1]           # 正确

  • 获取指定行/列数据

    # 1. 获取指定 行|列 数据
    df.loc[[0, 1, 2], ['country', 'year', 'lifeExp']]  # 行索引, 列名
    df.iloc[[0, 1, 2], [0, 2, 3]]  # 行索引, 列的编号
    ​
    # 2. 使用loc 获取所有行的, 某些列
    df.loc[:, ['year', 'pop']]  # 获取所有行的 year 和 pop列数据
    ​
    # 3. 使用 iloc 获取所有行的, 某些列
    df.iloc[:, [2, 3, -1]]  # 获取所有行的, 索引为: 2, 3 以及 最后1列数据
    ​
    # 4. loc只接收 行列名,  iloc只接收行列序号, 搞反了, 会报错.
    # df.loc[:, [2, 3, -1]]   # 报错
    # df.iloc[:, ['country', 'continent']]    # 报错
    ​
    # 5. 也可以通过 range()生成序号, 结合 iloc 获取连续多列数据.
    df.iloc[:, range(1, 5, 2)]
    df.iloc[:, list(range(1, 5, 2))]  # 把range()转成列表, 再传入, 也可以.
    ​
    # 6. 在iloc中, 使用切片语法 获取 n列数据.
    df.iloc[:, 3:5]   # 获取列编号为 3 ~ 5 区间的数据, 包左不包右, 即: 只获取索引为3, 4列的数据.
    df.iloc[:, 0:6:2] # 获取列编号为 0 ~ 6 区间, 步长为2的数据, 即: 只获取索引为0, 2, 4列的数据.
    ​
    # 7. 使用loc 和 iloc 获取指定行, 指定列的数据.
    df.loc[42, 'country']   # 行索引为42, 列名为:country 的数据
    df.iloc[42, 0]          # 行号为42, 列编号为: 0 的数据
    ​
    # 8. 获取多行多列
    df.iloc[[0, 1, 2], [0, 2, 3]]  # 行号, 列的编号
    df.loc[2:6, ['country', 'lifeExp', 'gdpPercap']]    # 行索引, 列名  推荐用法.

4.DataFrame-分组聚合计算
  • 概述

    • 在我们使用Excel或者SQL进行数据处理时,Excel和SQL都提供了基本的统计计算功能

    • 当我们再次查看gapminder数据的时候,可以根据数据提出几个问题

      • 每一年的平均预期寿命是多少?

      • 每一年的平均人口和平均GDP是多少?

      • 如果我们按照大洲来计算,每年个大洲的平均预期寿命,平均人口,平均GDP情况又如何?

      • 在数据中,每个大洲列出了多少个国家和地区?

  • 分组方式

    • 对于上面提出的问题,需要进行分组-聚合计算

    • 先将数据分组(每一年的平均预期寿命问题 按照年份将相同年份的数据分成一组

    • 对每组的数据再去进行统计计算如,求平均,求每组数据条目数(频数)等

    • 再将每一组计算的结果合并起来

    • 可以使用DataFrame的groupby方法完成分组/聚合计算

  • 语法格式

    df.groupby('分组字段')['要聚合的字段'].聚合函数()
    df.groupby(['分组字段','分组字段2'])[['要聚合的字段','要聚合的字段2']].聚合函数()

    分组后默认会把分组字段作为结果的行索引(index)

    如果是多字段分组, 得到的是MultiIndex(复合索引), 此时可以通过reset_index() 把复合索引变成普通的列

    例如: df.groupby(['year', 'continent'])[['lifeExp', 'gdpPercap']].mean().reset_index()

    基本代码调用的过程

    • 通过df.groupby('year')先创一个分组对象

    • 从分组之后的数据DataFrameGroupBy中,传入列名进行进一步计算返回结果为一个 SeriesGroupBy ,其内容是分组后的数据

    • 对分组后的数据计算平均值

  • 代码演示

    # 1. 统计每年, 平均预期寿命
    # SQL写法: select year, avg(lifeExp) from 表名 group by year;
    df.groupby('year')['lifeExp'].mean()
    ​
    # 2. 上述代码, 拆解介绍.
    df.groupby('year')                    # 它是1个 DataFrameGroupBy  df分组对象.
    df.groupby('year')['lifeExp']         # 从df分组对象中提取的 SeriesGroupBy Series分组对象(即: 分组后的数据)
    df.groupby('year')['lifeExp'].mean()  # 对 Series分组对象(即: 分组后的数据), 具体求平均值的动作.
    ​
    # 3. 对多列值, 进行分组聚合操作.
    # 需求: 按照年, 大洲分组, 统计每年, 每个大洲的 平均预期寿命, 平均gdp
    df.groupby(['year', 'continent'])[['lifeExp', 'gdpPercap']].mean()
    ​
    # 4. 统计每个大洲, 列出了多少个国家和地区.
    df.groupby('continent')['country'].value_counts()   # 频数计算, 即: 每个洲, 每个国家和地区 出现了多少次.
    df.groupby('continent')['country'].nunique()        # 唯一值计数, 即: 每个大洲, 共有多少个国家和地区 参与统计.

5.Pandas-基本绘图
  • 概述

    • 可视化在数据分析的每个步骤中都非常重要

    • 在理解或清理数据时,可视化有助于识别数据中的趋势

  • 参考代码

    data = df.groupby('year')['lifeExp'].mean()     # Series对象
    data.plot()     # 默认绘制的是: 折线图. 更复杂的绘图, 后续详解.

6.Pandas-常用排序方法
  • 第1步: 加载并查看数据

    import pandas as pd
    ​
    # 1. 加载数据.
    movie = pd.read_csv('data/movie.csv')
    movie.head()
    ​
    # 2. 查看数据字段说明.
    movie.columns
    ​
    # 3. 查看数据行列数
    movie.shape     # (4916, 28)
    ​
    # 4. 统计数值列, 并进行转置.
    movie.describe()
    movie.describe().T      # T表示转置操作, 即: 行列转换.
    ​
    # 5. 统计对象 和 类型列
    movie.describe(include='all')   # 统计所有的列, 包括: 数值列, 类别类型, 字符串类型
    movie.describe(include=object)  # 类别类型, 字符串类型
    ​
    # 6. 通过info() 方法了解不同字段的条目数量,数据类型,是否缺失及内存占用情况
    movie.info()

  • 第2步: 完整具体的需求

    # 需求1: 找到小成本, 高口碑电影.
    # 即: 从最大的N个值中, 选取最小值.
    ​
    # 1. 加载数据.
    movie2 = movie[['movie_title', 'imdb_score', 'budget']] # 电影名, 电影评分, 成本(预算)
    ​
    # nlargest(): 获取某个字段取值最大的前n条数据.
    # nsmallest(): 获取某个字段取值最大的前n条数据.
    # 2. 用 nlargest()方法, 选出 imdb_score 分数最高的100个数据.
    movie2.nlargest(100, 'imdb_score')
    ​
    # 3. 用 smallest()方法, 从上述数据中, 挑出预算最小的 5步电影.
    movie2.nlargest(100, 'imdb_score').nsmallest(5, 'budget')
    ​
    ​
    ​
    ​
    # 需求2: 找到每年imdb评分最高的电影
    # 1. 获取数据.
    movie3 = movie[['movie_title', 'title_year', 'imdb_score']] # 电影名, 上映年份, 电影评分
    ​
    # 2. sort_values() 按照年排序.
    movie3.sort_values('title_year', ascending=False).head()    # 按年降序排列, 查看数据.
    ​
    # 3. 同时对 title_year, imdb_score 两列进行排序.
    # movie4 = movie3.sort_values(['title_year', 'imdb_score'], ascending=[False, False])
    movie4 = movie3.sort_values(['title_year', 'imdb_score'], ascending=False)  # 效果同上
    movie4.head()
    ​
    # 4. 用 drop_duplicates()去重, 只保留每年的第一条数据
    # subset: 指定要考虑重复的列。
    # keep:   first/last/False   去重的时候, 保留第一条/保留最后一条/删除所有
    movie4.drop_duplicates(subset='title_year').head()   


http://www.kler.cn/news/311900.html

相关文章:

  • 通用定时器捕获实验20240920
  • 【软件方案】智慧社区总体解决方案(PPT原件)
  • Docker安装以及简单使用
  • 在线安全干货|如何更改IP地址?
  • 基于单片机的风机故障检测装置的设计与实现(论文+源码)
  • 批量处理docker容器以及镜像的脚本
  • 一、Numpy使用
  • C语言从头学61——学习头文件signal.h
  • 什么是“云原生”
  • Mysql梳理6——order by排序
  • 在 VS Code 中调试 C++ 项目
  • 【数据结构】动态开点线段树
  • 基于Android Studio 蜜雪冰城(奶茶饮品点餐)—原创
  • Java ERP系统源码深度解析:Spring Cloud Alibaba和Spring Boot的微服务实战
  • 云WAF能做什么?看它如何帮你应对网络攻击
  • 武汉网站建设实施方案
  • 猫咪为什么不吃猫罐头?解决挑食小猫!美味主食罐推荐!
  • 2.4 数据库表字段约束
  • 水经微图PC版5.0.0即将内测
  • MATLAB数学规划:2.线性规划
  • 分享一个 在线拍卖系统 商品竞拍平台Java、python、php三个技术版本(源码、调试、LW、开题、PPT)
  • MATLAB系列03:分支语句和编程设计
  • 指挥中心操作台怎么布局更合理
  • Can‘t connect to local MySQL server through socket
  • 【线性规划求解系列】MATLAB中使用linprog解决线性规划问题
  • 【学术会议:中国杭州,机器学习和计算机应用面临的新的挑战问题和研究方向】第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)
  • 大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解
  • Linux 环境永久更换国内pip镜像源地址
  • 【MySQL】表的相关操作
  • 你敢相信吗,我用AI撸了一个在线计算器网站!