三、数据分析入门


数据分析————pandas

  • 前言
  • 一、DataFrame-保存数据到文件
  • 二、DataFrame-读取文件数据
  • 三、DataFrame-数据分析入门
    • 3.1 按列加载数据
    • 3.2 按行加载数据
    • 3.3 获取指定行 / 列数据
  • 四、DataFrame-分组聚合计算
  • 五、Pandas-常用排序方法
    • 5.1 加载数据并查看
    • 5.2 完整具体需求
  • 六、综合案例
  • 总结


前言

  • 下面介绍数据分析中用到的numpy和pandas的一些知识,文章中所用数据集可以后台私信我获取。

一、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')  # 保存为tsv文件,需要设置分隔符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

二、DataFrame-读取文件数据

格式

# df对象 . read_数据格式(路径)
# 这里用的是相对路径 
df.read_csv('data/abc.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')  # 正常数据

三、DataFrame-数据分析入门

  • DataFrame用来处理结构化数据(SQL数据表,Excel表格)
  • Series用来处理单列数据,也可以把DataFrame看作由Series对象组成的字典或集合

3.1 按列加载数据

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

import pandas as pd# 1. 加载数据
df = pd.read_csv('data/gapminder.tsv', sep='\t')    # 指定切割符为\t
# 查看前n条数据,不传n的话 是默认五条
df.head(n)# 2. # 查看df类型
type(df)        # <class 'pandas.core.frame.DataFrame'>
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())

3.2 按行加载数据

代码如下(示例):

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

3.3 获取指定行 / 列数据

  • loc [ ] 使用索引和列名来获取指定行或列数据
  • iloc [ ] 使用行号和列编号来获取行或列数据

代码如下(示例):

# 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']]    # 行索引, 列名  推荐用法.

四、DataFrame-分组聚合计算

语法格式

df.groupby('分组字段')['要聚合的字段'].聚合函数()
df.groupby(['分组字段','分组字段2'])[['要聚合的字段','要聚合的字段2']].聚合函数()
  • 分组后默认会把分组字段作为结果的行索引(index)

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

代码如下(示例):

# 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()        # 唯一值计数, 即: 每个大洲, 共有多少个国家和地区 参与统计.

五、Pandas-常用排序方法

5.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()

5.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()  

六、综合案例

  • 用所学知识完成下列所有需求

准备数据

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']

查看源数据

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

完成下列需求

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

总结

  • 文章介绍了,DataFrame的读取和加载文件数据,并且学会对数据进行分组聚合操作、还有DataFrame中常用的排序函数。

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

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

相关文章

1.5 计算机网络的性能指标

参考&#xff1a;&#x1f4d5;深入浅出计算机网络 目录 速率 带宽 吞吐量 时延 时延带宽积 往返时间 利用率 丢包率 速率 速率是指数据的传送速率&#xff08;即每秒传送多少个比特&#xff09;&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&am…

Python | Leetcode Python题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class Node:def __init__(self, key"", count0):self.prev Noneself.next Noneself.keys {key}self.count countdef insert(self, node: Node) -> Node: # 在 self 后插入 nodenode.prev selfnode.next self.nextnode.…

Axure9破解

1.下载安装包 通过百度网盘分享的文件&#xff1a;Axure RP 9.zip 链接&#xff1a;https://pan.baidu.com/s/1Lcu-gg4qF8tTkOlt7bC2ww?pwdwmqq 提取码&#xff1a;wmqq 2.设置登录以及破解码 位置&#xff1a;帮助-管理授权-添加key Licensee&#xff1a;123456 Key&#…

健身房管理系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装健身房管理系统软件来发挥其高效地信息处理的作用&#xff…

2024年信息安全企业CRM选型与应用研究报告

数字化的生活给人们带来便利的同时也带来一定的信息安全隐患&#xff0c;如网络侵权、泄露用户隐私、黑客攻击等。在互联网高度发展的今天&#xff0c;信息安全与我们每个人、每个组织甚至每个国家都息息相关。 信息安全行业蓬勃发展。根据智研咨询数据&#xff0c;2021年&…

【LLM学习之路】9月22日 第九天 自然语言处理

【LLM学习之路】9月22日 第九天 直接看Transformer 第一章 自然语言处理 自然语言处理发展史 只要看的足够多&#xff0c;未必需要理解语言 统计语言模型发展史 统计语言模型&#xff1a; 判断一个句子是否合理&#xff0c;就计算这个句子会出现的概率 缺点是句子越长越…

大数据-145 Apache Kudu 架构解读 Master Table 分区 读写

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

NodeFormer:一种用于节点分类的可扩展图结构学习 Transformer

人工智能咨询培训老师叶梓 转载标明出处 现有的神经网络&#xff08;GNNs&#xff09;在处理大规模图数据时面临着一些挑战&#xff0c;如过度平滑、异质性、长距离依赖处理、边缘不完整性等问题&#xff0c;尤其是当输入图完全缺失时。为了解决这些问题&#xff0c;上海交通大…

2024年中国研究生数学建模竞赛B题 (WLAN组网吞吐量机理建模+决策树 完整建模文章)

2024年中国研究生数学建模竞赛B题 (WLAN组网吞吐量机理建模决策树 完整建模文章) 问题重述和分析 问题重述 本题旨在基于实际测量的WLAN&#xff08;无线局域网&#xff09;数据&#xff0c;建立一个精确的系统吞吐量预测模型。具体而言&#xff0c;提供了多个包含网络拓扑、…

在虚幻引擎中创建毛发/头发

在虚幻引擎中创建毛发/头发 , 首先开启两个插件 Groom 和 Alembic Groom Importer 打开蒙皮缓存 导出人物模型 将人物导入Blender , 选择需要种植头发的点 指定并选择 点击毛发 这里变成爆炸头了 , 把数量和长度调一下 切换到梳子模式 调整发型 导出为abc , 文件路径不…

mysql 内存被打满记录

一&#xff1a;早上收到报警&#xff1a;提示&#xff1a;您的云数据库RDS的1个实例因存储空间满将被锁定&#xff0c;请关注实例的存储空间使用情况&#xff0c;可通过存储扩容或空间清理解除锁定。后续查看错误日志如下&#xff1a;磁盘没有空间了 没有多余的空间写binlog和…

推荐一款开源的Redis桌面客户端

TinyRDM 是一个现代化的、轻量级的跨平台 Redis 桌面客户端&#xff0c;能在 Mac、Windows 和 Linux 系统上使用。它有着现代化的设计风格&#xff0c;界面既简洁又清晰&#xff0c;操作起来方便又高效。不管是刚开始接触的新手&#xff0c;还是经验丰富的开发者&#xff0c;都…

基于OpenCV的单目测距

随着计算机视觉技术的发展&#xff0c;单目测距作为一种重要的视觉测量手段&#xff0c;在众多领域得到了广泛的应用。本文将探讨基于OpenCV的单目测距原理、局限性、实际应用场景以及一些优化方案。 单目测距的原理 单目测距是指利用一台摄像机拍摄到的单一图像来进行距离测量…

Kubernetes Pod调度基础(kubernetes)

实验环境依旧是k8s快照&#xff0c;拉取本次实验所需的镜像文件&#xff1b; 然后在master节点上传已经编写好的yaml文件&#xff1b; 然后同步会话&#xff0c;导入镜像&#xff1b; pod控制器&#xff1a; 标签选择器--》标签&#xff1a; 标签&#xff1a; 在Kubernetes&…

Nat Med|机器学习+高通量筛选,发现用于治疗胶质母细胞瘤的神经活性药物|顶刊精析·24-09-23

小罗碎碎念 今日顶刊&#xff1a;Nat Med 这篇文章是2024-09-20发表在《Nature Medicine》上的一篇研究型论文&#xff0c;标题为“High-throughput identification of repurposable neuroactive drugs with potent anti-glioblastoma activity”。 先打个提前量&#xff0c;发…

人工智能面试题(Artificial Intelligence Algorithm Interview Questions)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

ruoyi源码解析学习 - 微服务版 - ruoyi-gateway

com.ruoyi.gateway 今天简单看看若依的gateway的配置模块干了啥 最近面试很多外包公司&#xff0c;都对低代码平台有点要求&#xff0c;这些代码虽说用起来不费劲&#xff0c;但是其中还是有很多细节能让我学习学习的。&#xff08;微服务版&#xff0c;上次搞jeecgboot的笔试…

【爬虫工具】小红书评论高级采集软件

用python开发的爬虫采集工具【爬小红书搜索评论软件】&#xff0c;支持根据关键词采集评论。 思路&#xff1a;笔记关键词->笔记链接->评论 软件界面&#xff1a; 完整文章、详细了解&#xff1a; https://mp.weixin.qq.com/s/C_TuChFwh8Vw76hTGX679Q 好用的软件一起分…

Vue3:具名插槽

目录 一.性质与作用 1.基本性质 2.使用方式 3.作用 4.应用场景 5.注意事项 二.使用 1.父组件 2.子组件 三.代码 1.父组件代码 2.子组件代码 四.效果 具名插槽在Vue3中用于为组件提供一种方式&#xff0c;允许父组件向子组件注入内容&#xff0c;并且可以指定这些内…

【HarmonyOS】应用权限原理和封装

背景 在项目中&#xff0c;避免不了需要调用系统资源和系统能力&#xff0c;比如&#xff1a;日历读写、摄像头等。因此&#xff0c;需要了解对系统资源访问权限的申请方式方法。 授权方式 包括两种授权方式&#xff0c;分别是system_grant(系统授权) 和 user_grant(用户授权)…