0基础跟德姆(dom)一起学AI 数据处理和统计分析05-Pandas数分入门

* DataFrame读写文件
* DataFrame加载部分数据
* DataFrame分组聚合计算
* DataFrame常用排序方式
* DataFrame案例-链家数据分析

---

1.DataFrame-保存数据到文件

* 格式

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

* 代码演示

  > 如要保存的对象是计算的中间结果,或者以后会在Python中复用,推荐保存成pickle文件
  >
  > 如果保存成pickle文件,只能在python中使用, 文件的扩展名可以是`.p,.pkl,.pickl`

  ```python
  # 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需要额外安装如下三个包

  ```python
  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-读取文件数据

* 格式

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

* 代码演示

  ```python
  # 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-数据分析入门

* 回顾 `DataFrame` 和 `Series`概念

  * Pandas是用于数据分析的开源Python库,可以实现数据加载,清洗,转换,统计处理,可视化等功能
  * DataFrame和Series是Pandas最基本的两种数据结构
  * **DataFrame用来处理结构化数据**(SQL数据表,Excel表格)
  * **Series用来处理单列数据**,也可以把DataFrame看作由Series对象组成的字典或集合

* **按列加载数据**

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

  ```python
  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())
  ```

* **按行加载数据**

  ```python
  # 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]           # 正确
  ```

* **获取指定行/列数据**

  ```python
  # 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方法完成分组/聚合计算**

* 语法格式

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

  > 分组后默认会把**分组字段作为结果的行索引(index)**
  >
  > 如果是多字段分组, 得到的是MultiIndex(复合索引), 此时可以通过reset_index() 把复合索引变成普通的列
  >
  > 例如: **df.groupby(['year', 'continent'])[['lifeExp', 'gdpPercap']].mean().reset_index()**
  >
  > 基本代码调用的过程
  >
  > - 通过df.groupby('year')先创一个分组对象
  > - 从分组之后的数据DataFrameGroupBy中,传入列名进行进一步计算返回结果为一个 SeriesGroupBy ,其内容是分组后的数据
  > - 对分组后的数据计算平均值

* 代码演示

  ```python
  # 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-基本绘图

* 概述

  * 可视化在数据分析的每个步骤中都非常重要
  * 在理解或清理数据时,可视化有助于识别数据中的趋势

* 参考代码

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


6.Pandas-常用排序方法

* 第1步: 加载并查看数据

  ```python
  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步: 完整具体的需求

  ```python
  # 需求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()   
  ```

7.Pandas案例-链家数据分析

* 准备数据

  ```python
  import pandas as pd
  
  # 1. 加载数据
  house_data = pd.read_csv('data/LJdata.csv')
  
  # 2. 把列名替换为英文
  # 2.1 查看原始列名
  house_data.columns
  
  # 2.2 替换原始列名.
  house_data.columns = ['district', 'address', 'title', 'house_type', 'area', 'price', 'floor', 'build_time', 'direction', 'update_time', 'view_num', 'extra_info', 'link']
  ```

* 查看源数据

  ```python
  # 3. 查看数据
  house_data.head()   # 查看数据前 5 行 
  house_data.info()   # 查看列数据 分布
  house_data.describe()   # 查看列统计指标
  house_data.shape        # 查看数据维度: (2760, 13)
  ```

* 完成具体需求

  ```python
  # 4. 需求1: 找到租金最低, 和租金最高的房子.
  # 4.1 获取最低价格 和 最高价格.   by:表示 根据哪列排序, ascending 表示升序或者降序
  house_data.sort_values(by='price').head(1)  # 1300元
  house_data.sort_values(by='price').tail(1)  # 210000元
  
  # 4.2 查看具体的 租金最高 和 租金最低的房子.
  house_data.loc[house_data['price'] == 210000]
  house_data.loc[house_data['price'] == 1300]
  
  
  # 5. 需求2: 找到最近新上的 10套房源.
  house_data.sort_values(by='update_time', ascending=False).head(10)
  
  
  # 6. 需求3: 查看所有更新时间.
  house_data['update_time'].unique()
  
  
  # 7. 需求4: 查看看房人数
  house_data['view_num'].mean()       # 平均值
  house_data['view_num'].median()     # 中位数
  house_data.describe()               # 可以查看上述值.
  
  # 不同看房人数的房源数量,  as_index=False 表示 分组字段不作为行索引(默认为True)
  tmp_df = house_data.groupby('view_num', as_index=False)['district'].count()
  tmp_df.columns = ['view_num', 'count']
  tmp_df.head()
  
  
  # 8. 需求5: 通过图表, 展示上述的数据.
  tmp_df['count'].plot(kind='bar', figsize=(20,10))    # 柱状体, 宽, 高.
  
  
  # 9. 需求6: 房租价格分布
  house_data['price'].mean()  # 平均值
  house_data['price'].std()   # 标准差
  house_data['price'].median()  # 中位数
  
  
  # 10. 需求7: 看房人数最多的朝向.
  popular_direction = house_data.groupby('direction', as_index=False)[['view_num']].sum()
  house_data.groupby('direction', as_index=False)[['view_num']].max()
  
  popular_direction[popular_direction['view_num'] == popular_direction['view_num'].max()]
  
  
  # 11. 需求8: 房型分布情况.
  # 设置正常显示汉字和负号
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
  plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
  
  # mac本设置如下
  # plt.rcParams['font.family'] = 'Arial Unicode MS'
  
  house_type_dis = house_data.groupby(['house_type']).count()
  # %matplot inline
  house_type_dis['district'].plot(kind='bar', figsize=(20, 10))
  
  
  
  # 12. 需求9: 最受欢迎的房型.
  tmp = house_data.groupby('house_type', as_index=False)['view_num'].sum()
  tmp = house_data.groupby('house_type', as_index=False).agg({'view_num': 'sum'}) # 效果同上
  tmp[tmp.view_num == tmp.view_num.max()]
  
  
  # 13. 需求10: 房子的平均租房价格 (元/平米)
  house_data.loc[:, 'price_per_m2'] = house_data['price'] / house_data['area']
  house_data['price_per_m2'].mean()
  
  
  # 14. 需求11: 热门小区
  address_df = house_data[['address', 'view_num']].groupby(['address'], as_index=False).sum()
  address_df.sort_values(by='view_num', ascending=False).head()
  
  
  # 15. 需求12: 出租房源最多的小区.
  tmp_df2 = house_data[['address', 'view_num']].groupby(['address'], as_index=False).count()
  tmp_df2.columns = ['address', 'count']
  tmp_df2.nlargest(columns = 'count', n = 1)
  ```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147498.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Deepin man 没有关于printf 的手册页条目

问题 man 3 printf:在第 3 节中没有关于 printf 的手册页条目。 解决方法:安装manpages发开库。 搜索包 apt search manpages安装 sudo apt install manpages-dev若没有manpages-dev,安装manpages-posix-dev,应该也可以&#x…

【成品论文】2024年华为杯研赛E题25页高质量成品论文(后续会更新

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片链接,那是获取资料的入口! 点击链接加入【2024华为杯研赛资料汇总】:https://qm.qq.com/q/Mxv2XNWxUc https://qm.qq.com/q/Mxv2XNWxUc 高速公路应急车道紧急启用模型…

深度学习02-pytorch-03-张量的数值计算

张量(Tensor)是多维数组的通用化概念,它可以表示标量(0维)、向量(1维)、矩阵(2维)以及更高维度的数据。在深度学习和数值计算中,张量是基础数据结构&#xff…

基于python的api扫描器系统的设计与实现

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

MySQL练手题--周内每天销售情况(困难)

一、准备工作 Create table If Not Exists Orders (order_id int, customer_id int, order_date date, item_id varchar(30), quantity int); Create table If Not Exists Items (item_id varchar(30), item_name varchar(30), item_category varchar(30)); Truncate table Or…

【软件文档】软件项目试运行方案(word实际套用2024)

软件项目试运行方案(Word原件参考) 一、试运行目的 二、试运行的准备 三、试运行时间 四、试运行制度 五、试运行具体内容与要求 软件全套资料部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表&#xff0c…

python画图1

import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"]# 模拟数据 years [2016, 2017, 2018, 2019, 2020, 2021, 2022] market_size [7950, 8931, 9940, 11205, 12305, 13199, 14980] my_color #3e9df5plt.plot(years, market_s…

《他们的奇妙时光》圆满收官,葛秋谷新型霸总获好评

9月21日,由王枫、张开法执导,周洁琼、葛秋谷领衔主演的奇幻爱情题材都市喜剧《他们的奇妙时光》圆满收官。该剧讲述了意外被游戏角色刑天附体的设计师宋灵灵,为修复游戏漏洞,被迫与能压制刑天的甲方总裁萧然同居,两人在…

局域网设备自动发现常用方法

文章目录 需求实现方法ARP (Address Resolution Protocol)Ping ip的流程抓包如下代码实现 mDNS 对比测试Avahi 介绍Avahi 安装Avahi 使用测试代码 需求 局域网设备自动发现是软件开发中的一个常见且重要的需求,它简化了设备间的协作机制,降低了软件各模…

MySQL内存(Buffer Pool)

Buffer Pool MySQL 的数据存在磁盘,但是不能每次读取数据都从磁盘里去,这样磁盘IO太频繁,存在性能问题。 InnoDB设计了一个缓存池(Buffer Pool),缓冲池在内存中。 默认配置Buffer Pool大小为128MB&#xf…

Trapezoidal Decomposition梯形分解算法(TCD)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言Trapezoidal Decomposition梯形分解算法(TCD)原理(1)第一种原理(2…

DataX实战:从MongoDB到MySQL的数据迁移--修改源码并测试打包

在现代数据驱动的业务环境中,数据迁移和集成是常见的需求。DataX,作为阿里云开源的数据集成工具,提供了强大的数据同步能力,支持多种数据源和目标端。本文将介绍如何使用DataX将数据从MongoDB迁移到MySQL。 环境准备 安装MongoDB…

智慧医院人工智能应用场景 | 智能导诊系统源码

近年来,智能医疗在国内外的发展热度不断提升。图像识别、深度学习、神经网络、大模型、语音等关键技术的突破带来了人工智能技术新一轮的发展。 场景一:智能机器人 医疗机器人是指能够在医疗领域执行特定任务或功能的机器人,包括手术机器人、…

【LLaMa2入门】从零开始训练LLaMa2

目录 1 背景2 搭建环境2.1 硬件配置2.2 搭建虚拟环境2.2.1 创建虚拟环境2.2.2 安装所需的库 3 准备工作3.1 下载GitHub代码3.2 下载模型3.3 数据处理3.3.1 下载数据3.3.2 数据集tokenize预处理 4 训练4.1 修改配置4.2 开始训练4.3 多机多卡训练 5 模型推理5.1 编译5.1.1 安装gc…

Java算法专栏

专栏导读 在当今这个技术日新月异的时代,Java算法作为软件开发的核心,对于提升程序性能和解决复杂问题至关重要。本“Java算法”专栏旨在帮助读者深入理解Java编程语言中的算法原理和应用,通过实战案例和深入分析,使读者能够掌握…

软媒市场新探索:软文媒体自助发布,开启自助发稿新篇章

在繁华喧嚣的软媒市场中,每一个声音都在竭力呼喊,每一个品牌都在奋力展现。而软文,作为一种温柔而坚韧的营销力量,正逐渐崭露头角。特别是软文媒体自助发布平台的出现,更是为企业提供了一个全新的、高效的自助发稿渠道。 软媒市场自助发布平台,正如其名,是一个让企业能够自主发…

【LeetCode】每日一题 2024_9_21 边积分最高的节点(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:边积分最高的节点 代码与解题思路 func edgeScore(edges []int) (ans int) {// 直接维护哈希最大值即可mp : map[int]int{}for i, v : range edges {mp[v] i// 如果多个节点的 边积分 相…

【数据库】常用数据库简介

目录 🍔 常用的关系型数据库 🍔 Mysql简介 🍔 SQL 简介 SQL语句的分类 SQL 写法 SQL 常用的数据类型 🍔 DDL语句 对数据库的操作 对数据表的操作 🍔 DML语句 插入数据 insert into 修改数据 update 删除数…

Ubuntu下使用 python搭建服务实现从web端远程配置设备网口

1、通过文件配置Ubuntu设备网口 在Ubuntu工控机上,通过文件配置网口(网络接口)可以让网络配置在每次系统启动时自动生效。以下是常见的方法步骤: 1.1 使用 netplan 配置网口(Ubuntu 18.04 及以上版本) 编…

探索微软Copilot Agents:如何通过Wave 2 AI彻底改变工作方式

微软在最近的Copilot Wave 2发布会上,展示了一系列将彻底改变日常工作流程的新AI功能,尤其是 Copilot Agents,它们不仅仅是简单的工具,而是真正的工作助理,可以自动完成任务、提供智能分析并帮助你做出决策。这些新功能…