Python---Pandas万字总结(1)

Pandas基础-1

Pandas 是 一个强大的分析结构化数据的工具集。Pandas 以 NumPy 为基础(实现数据存储和运算),提供了专门用于数据分析的类型、方法和函数,对数据分析和数据挖掘提供了很好的支持;同时 pandas 还可以跟数据可视化工具 matplotlib 很好的整合在一起,非常轻松愉快的实现数据可视化呈现。

Pandas 核心的数据类型是Series(数据系列)、DataFrame(数据窗/数据框),分别用于处理一维和二维的数据,除此之外,还有一个名为Index的类型及其子类型,它们为SeriesDataFrame提供了索引功能。日常工作中DataFrame使用得最为广泛,因为二维的数据结构刚好可以对应有行有列的表格。SeriesDataFrame都提供了大量的处理数据的方法,数据分析师以此为基础,可以实现对数据的筛选、合并、拼接、清洗、预处理、聚合、透视和可视化等各种操作。

创建Series对象

Pandas 库中的Series对象可以用来表示一维数据结构,但是多了索引和一些额外的功能。Series类型的内部结构包含了两个数组,其中一个用来保存数据,另一个用来保存数据的索引。我们可以通过列表或数组创建Series对象,代码如下所示。

代码:

import numpy as np
import pandas as pdser1 = pd.Series(data=[120, 380, 250, 360], index=['一季度', '二季度', '三季度', '四季度'])
ser1

说明data参数表示数据,index参数表示数据的索引,相当于数据对应的标签。

输出:

一季度    120
二季度    380
三季度    250
四季度    360
dtype: int64

通过字典创建Series对象。

代码:

ser2 = pd.Series({'一季度': 320, '二季度': 180, '三季度': 300, '四季度': 405})
ser2

说明:通过字典创建Series对象时,字典的键就是数据的标签(索引),键对应的值就是数据。

输出:

一季度    320
二季度    180
三季度    300
四季度    405
dtype: int64

Series对象的运算

标量运算

我们尝试给刚才的ser1每个季度加上10,代码如下所示。

代码:

ser1 += 10
ser1

输出:

一季度    130
二季度    390
三季度    260
四季度    370
dtype: int64
矢量运算

我们尝试把ser1ser2对应季度的数据加起来,代码如下所示。

代码:

ser1 + ser2

输出:

一季度    450
二季度    570
三季度    560
四季度    775
dtype: int64
索引运算
普通索引

跟数组一样,Series对象也可以进行索引和切片操作,不同的是Series对象因为内部维护了一个保存索引的数组,所以除了可以使用整数索引检索数据外,还可以通过自己设置的索引(标签)获取对应的数据。

使用整数索引。

代码:

ser1[2]

输出:

260

使用自定义索引。

代码:

ser1['三季度']

输出:

260

代码:

ser1['一季度'] = 380
ser1

输出:

一季度    380
二季度    390
三季度    260
四季度    370
dtype: int64
切片索引

Series对象的切片操作跟列表、数组类似,通过给出起始和结束索引,从原来的Series对象中取出或修改部分数据,这里也可以使用整数索引和自定义的索引,代码如下所示。

代码:

ser2[1:3]

输出:

二季度    180
三季度    300
dtype: int64

代码:

ser2['二季度':'四季度']

输出:

二季度    180
三季度    300
四季度    405
dtype: int64

提示:在使用自定义索引进行切片时,结束索引对应的元素也是可以取到的。

代码:

ser2[1:3] = 400, 500
ser2

输出:

一季度    320
二季度    400
三季度    500
四季度    405
dtype: int64
花式索引

代码:

ser2[['二季度', '四季度']]

输出:

二季度    400
四季度    405
dtype: int64

代码:

ser2[['二季度', '四季度']] = 600, 520
ser2

输出:

一季度    320
二季度    600
三季度    500
四季度    520
dtype: int64
布尔索引

代码:

ser2[ser2 >= 500]

输出:

二季度    600
三季度    500
四季度    520
dtype: int64

Series对象的属性和方法

Series对象的属性和方法非常多,我们就捡着重要的跟大家讲吧。先看看下面的表格,它展示了Series对象常用的属性。

属性说明
dtype / dtypes返回Series对象的数据类型
hasnans判断Series对象中有没有空值
at / iat通过索引访问Series对象中的单个值
loc / iloc通过索引访问Series对象中的单个值或一组值
index返回Series对象的索引(Index对象)
is_monotonic判断Series对象中的数据是否单调
is_monotonic_increasing判断Series对象中的数据是否单调递增
is_monotonic_decreasing判断Series对象中的数据是否单调递减
is_unique判断Series对象中的数据是否独一无二
size返回Series对象中元素的个数
valuesndarray的方式返回Series对象中的值(ndarray对象)

我们可以通过下面的代码来了解Series对象的属性。

代码:

print(ser2.dtype)                    # 数据类型
print(ser2.hasnans)                  # 有没有空值
print(ser2.index)                    # 索引
print(ser2.values)                   # 值
print(ser2.is_monotonic_increasing)  # 是否单调递增
print(ser2.is_unique)                # 是否每个值都独一无二

输出:

int64
False
Index(['一季度', '二季度', '三季度', '四季度'], dtype='object')
[320 600 500 520]
False
True

Series对象的方法很多,下面我们通过一些代码片段为大家介绍常用的方法。

统计相关

Series对象支持各种获取描述性统计信息的方法。

代码:

print(ser2.count())   # 计数
print(ser2.sum())     # 求和
print(ser2.mean())    # 求平均
print(ser2.median())  # 找中位数
print(ser2.max())     # 找最大
print(ser2.min())     # 找最小
print(ser2.std())     # 求标准差
print(ser2.var())     # 求方差

输出:

4
1940
485.0
510.0
600
320
118.18065267490557
13966.666666666666

Series对象还有一个名为describe()的方法,可以获得上述所有的描述性统计信息,如下所示。

代码:

ser2.describe()

输出:

count      4.000000
mean     485.000000
std      118.180653
min      320.000000
25%      455.000000
50%      510.000000
75%      540.000000
max      600.000000
dtype: float64

提示:因为describe()返回的也是一个Series对象,所以也可以用ser2.describe()['mean']来获取平均值,用ser2.describe()[['max', 'min']]来获取最大值和最小值。

如果Series对象有重复的值,我们可以使用unique()方法获得由独一无二的值构成的数组;可以使用nunique()方法统计不重复值的数量;如果想要统计每个值重复的次数,可以使用value_counts()方法,这个方法会返回一个Series对象,它的索引就是原来的Series对象中的值,而每个值出现的次数就是返回的Series对象中的数据,在默认情况下会按照出现次数做降序排列,如下所示。

代码:

ser3 = pd.Series(data=['apple', 'banana', 'apple', 'pitaya', 'apple', 'pitaya', 'durian'])
ser3.value_counts()

输出:

apple     3
pitaya    2
durian    1
banana    1
dtype: int64

代码:

ser3.nunique()

输出:

4

对于ser3,我们还可以用mode()方法来找出数据的众数,由于众数可能不唯一,所以mode()方法的返回值仍然是一个Series对象。

代码:

ser3.mode()

输出:

0    apple
dtype: object
处理数据

Series对象的isna()isnull()方法可以用于空值的判断,notna()notnull()方法可以用于非空值的判断,代码如下所示。

代码:

ser4 = pd.Series(data=[10, 20, np.nan, 30, np.nan])
ser4.isna()

说明np.nan是一个IEEE 754标准的浮点小数,专门用来表示“不是一个数”,在上面的代码中我们用它来代表空值;当然,也可以用 Python 中的None来表示空值,在 pandas 中None也会被处理为np.nan

输出:

0    False
1    False
2     True
3    False
4     True
dtype: bool

代码:

ser4.notna()

输出:

0     True
1     True
2    False
3     True
4    False
dtype: bool

Series对象的dropna()fillna()方法分别用来删除空值和填充空值,具体的用法如下所示。

代码:

ser4.dropna()

输出:

0    10.0
1    20.0
3    30.0
dtype: float64

代码:

ser4.fillna(value=40)  # 将空值填充为40

输出:

0    10.0
1    20.0
2    40.0
3    30.0
4    40.0
dtype: float64

代码:

ser4.fillna(method='ffill')  # 用空值前面的非空值填充

输出:

0    10.0
1    20.0
2    20.0
3    30.0
4    30.0
dtype: float64

需要提醒注意的是,dropna()fillna()方法都有一个名为inplace的参数,它的默认值是False,表示删除空值或填充空值不会修改原来的Series对象,而是返回一个新的Series对象。如果将inplace参数的值修改为True,那么删除或填充空值会就地操作,直接修改原来的Series对象,此时方法的返回值是None。后面我们会接触到的很多方法,包括DataFrame对象的很多方法都会有这个参数,它们的意义跟这里是一样的。

Series对象的mask()where()方法可以将满足或不满足条件的值进行替换,如下所示。

代码:

ser5 = pd.Series(range(5))
ser5.where(ser5 > 0)

输出:

0    NaN
1    1.0
2    2.0
3    3.0
4    4.0
dtype: float64

代码:

ser5.where(ser5 > 1, 10)

输出:

0    10
1    10
2     2
3     3
4     4
dtype: int64

代码:

ser5.mask(ser5 > 1, 10)

输出:

0     0
1     1
2    10
3    10
4    10
dtype: int64

Series对象的duplicated()方法可以帮助我们找出重复的数据,而drop_duplicates()方法可以帮我们删除重复数据。

代码:

ser3.duplicated()

输出:

0    False
1    False
2     True
3    False
4     True
5     True
6    False
dtype: bool

代码:

ser3.drop_duplicates()

输出:

0     apple
1    banana
3    pitaya
6    durian
dtype: object

Series对象的apply()map()方法非常重要,它们可以通过字典或者指定的函数来处理数据,把数据映射或转换成我们想要的样子。这两个方法在数据准备阶段非常重要,我们先来试一试这个名为map的方法。

代码:

ser6 = pd.Series(['cat', 'dog', np.nan, 'rabbit'])
ser6

输出:

0       cat
1       dog
2       NaN
3    rabbit
dtype: object

代码:

ser6.map({'cat': 'kitten', 'dog': 'puppy'})

说明:通过字典给出的映射规则对数据进行处理。

输出:

0    kitten
1     puppy
2       NaN
3       NaN
dtype: object

代码:

ser6.map('I am a {}'.format, na_action='ignore')

说明:将指定字符串的format方法作用到数据系列的数据上,忽略掉所有的空值。

输出:

0       I am a cat
1       I am a dog
2              NaN
3    I am a rabbit
dtype: object

我们创建一个新的Series对象,

ser7 = pd.Series([20, 21, 12],  index=['London', 'New York', 'Helsinki'])
ser7

输出:

London      20
New York    21
Helsinki    12
dtype: int64

代码:

ser7.apply(np.square)

说明:将求平方的函数作用到数据系列的数据上,也可以将参数np.square替换为lambda x: x ** 2

输出:

London      400
New York    441
Helsinki    144
dtype: int64

代码:

ser7.apply(lambda x, value: x - value, args=(5, ))

注意:上面apply方法中的lambda函数有两个参数,第一个参数是数据系列中的数据,而第二个参数需要我们传入,所以我们给apply方法增加了args参数,用于给lambda函数的第二个参数传值。

输出:

London      15
New York    16
Helsinki     7
dtype: int64
取头部值和排序

Series对象的sort_index()sort_values()方法可以用于对索引和数据的排序,排序方法有一个名为ascending的布尔类型参数,该参数用于控制排序的结果是升序还是降序;而名为kind的参数则用来控制排序使用的算法,默认使用了quicksort,也可以选择mergesortheapsort;如果存在空值,那么可以用na_position参数空值放在最前还是最后,默认是last,代码如下所示。

代码:

ser8 = pd.Series(data=[35, 96, 12, 57, 25, 89], index=['grape', 'banana', 'pitaya', 'apple', 'peach', 'orange']
)
ser8.sort_values()  # 按值从小到大排序

输出:

pitaya    12
peach     25
grape     35
apple     57
orange    89
banana    96
dtype: int64

代码:

ser8.sort_index(ascending=False)  # 按索引从大到小排序

输出:

pitaya    12
peach     25
orange    89
grape     35
banana    96
apple     57
dtype: int64

如果要从Series对象中找出元素中最大或最小的“Top-N”,我们不需要对所有的值进行排序的,可以使用nlargest()nsmallest()方法来完成,如下所示。

代码:

ser8.nlargest(3)  # 值最大的3个

输出:

banana    96
orange    89
apple     57
dtype: int64

代码:

ser8.nsmallest(2)  # 值最小的2个

输出:

pitaya    12
peach     25
dtype: int64
绘制图表

Series对象有一个名为plot的方法可以用来生成图表,如果选择生成折线图、饼图、柱状图等,默认会使用Series对象的索引作为横坐标,使用Series对象的数据作为纵坐标。下面创建一个Series对象并基于它绘制柱状图,代码如下所示。

代码:

import matplotlib.pyplot as pltser9 = pd.Series({'Q1': 400, 'Q2': 520, 'Q3': 180, 'Q4': 380})# 通过plot方法的kind指定图表类型为柱状图
ser9.plot(kind='bar')# 定制纵轴的取值范围
plt.ylim(0, 600)# 定制横轴刻度(旋转到0度)
plt.xticks(rotation=0)# 为柱子增加数据标签
for i in range(ser9.size):plt.text(i, ser9[i] + 5, ser9[i], ha='center')
plt.show()

输出:

在这里插入图片描述

我们也可以将其绘制为饼图,代码如下所示。

代码:

# plot方法的kind参数指定了图表类型为饼图
# autopct会自动计算并显示百分比
# pctdistance用来控制百分比到圆心的距离ser9.plot(kind='pie', autopct='%.1f%%', pctdistance=0.65)
plt.show()

输出:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubeadm 在vubuntu22.04.4 server 上安装kubernetes 1.28.9

一、基础安装(所有节点执行)---------------------------------------- 时间同步 关闭防火墙 sudo ufw disable sudo ufw status关闭交换内存 临时关闭 sudo swapoff -a free -m永久关闭 sudo vim /etc/fstab 注释掉交换内存 转发 IPv4 并让 iptab…

云贝教育 |【好课上新】ITSS服务工程师与服务经理认证培训

课程前言 ITSS是中国电子技术标准化研究院推出的,包含“IT 服务工程师”和“IT 服务经理”的系列培训。有效满足GB/T 28827.1 的符合性评估要求和ITSS服务资质升级要求。 IT 服务工程师”结合 IT服务从业人员能力规范和要求,从服务技术、服务技巧和服务…

【Linux】调试器-gdb使用

大家好,我是苏貝,本篇博客带大家了解Linux的编译器-gcc/g,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1. 背景(A) 看大小(B) 查看ELF格式的文件 2.使用(A) 进入gdb(B) quit/q&#xff…

【码农日常】将mp4转换为逐帧图片

项目场景: 拍摄了一段视频记录设备工作的状态和测量仪器的实时数据。由于测量仪器岁数比较大,不够智能,遂打算将视频转换为逐帧图片进行分析。 网上没找到现成工具,借鉴网上大神的操作方式打算用python写一个工具。 问题描述 用…

一、VIsual Studio下的Qt环境配置(Visual Studio 2022 + Qt 5.12.10)

一、下载编译器Visual Studio2022和Qt 5.12.10 Visual Studio 2022 社区版就够学习使用了 Qt5.12.10 安装教程网上搜,一大堆 也很简单,配置直接选默认,路径留意一下即可 二、配置环境 Ⅰ,配置Qt环境变量 系统变量下的Path&a…

【DevOps】深入解析 Docker日志分析和服务故障排除技巧

在今天的云计算和微服务架构中,Docker凭借其轻量级和高效的容器化技术,已成为软件部署不可或缺的一部分。然而,随着应用复杂性的增加,有效的日志管理和故障排除能力成为了开发者和运维人员必须掌握的核心技能。本文将带你深入探索…

AI办公自动化-用kimi自动清理删除重复文件

在kimichat中输入提示词: 你是一个Python编程专家,要完成一个编写Python脚本的任务,具体步骤如下: 1、打开文件夹D:\downloads; 2、哈希值比较比较里面所有的文件,如果文件相同,那么移动多余…

群晖NAS本地搭建Bitwarden密码管理服务并实现远程同步密码托管

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序,适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…

华为配置智能无损网络综合

配置智能无损网络综合示例 适用产品和版本 安装了P系列单板的CE16800、CE6866、CE6866K、CE8851-32CQ8DQ-P、CE8851K系列交换机V300R020C00或更高版本。 安装了SAN系列单板的CE16800、CE6860-SAN、CE8850-SAN系列交换机V300R020C10或更高版本。 CE6860-HAM、CE8850-HAM系列交换…

初识FlaskMySQL实现前后端通信 全栈开发之路——后端篇(1)

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…

02-WPF_基础(二)

3、控件学习 控件学习 布局控件: panel、Grid 内容空间:Context 之恶能容纳一个控件或布局控件 代表提内容控件:内容控件可以设置标题 Header 父类:HeaderContextControl。 条目控件:可以显示一列数据&#xf…

如何解决3D模型变黑或贴图不显示的问题---模大狮模型网

在进行3D建模和视觉渲染时,经常会遇到模型表面变黑或贴图不显示的问题,这可能严重影响最终视觉效果的质量。这些问题通常与材质设置、光照配置或文件路径错误有关。本文将探讨几种常见原因及其解决方法,帮助3D艺术家和开发者更有效地处理这些…

Java | Leetcode Java题解之第88题合并两个有序数组

题目: 题解: class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2--];} else if (p2 -1) {cur nums1[p…

Hive表数据优化

Hive表数据优化 1.文件格式 为Hive表中的数据选择一个合适的文件格式,对提高查询性能的提高是十分有益的。 (1)Text File 文本文件是Hive默认使用的文件格式,文本文件中的一行内容,就对应Hive表中的一行记录。 可…

VTK图形算法API:vtkSphereSource,球几何数据

大家好,我是先锋,专注于AI领域和编程技术分享,在这里定期分享计算机编程知识,AI应用知识,职场经验; 本系列介绍VTK图像算法API,后续会介绍VTK项目实践应用,关注我,不错过…

GPS与精致农业 无人机应用 农业遥感 农业类

全球定位系统是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。GPS系统最基本的特点是以“多星、高轨、高频、测量-测距”为体制,以高精度的原子钟为核心。GPS作为新一代卫星导航与定位系统,不仅具有全球性、全…

LeetCode 力扣题目:买卖股票的最佳时机 III

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

Django5.0入门基本使用

文章目录 一、安装1、安装django环境2、创建项目3、启动服务器4、创建第一个应用(1)创建应用(2)编写视图(3)映射url(4)测试 二、核心概念1、django.urls 函数(1&#xff…

U盘打不开提示格式化怎么办?(含数据恢复及U盘修复教程)

引言: 随着数字化时代的发展,U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而,有时我们可能会遇到U盘突然无法打开,并提示需要格式化的问题。这不仅会打乱我们的工作节奏,还可能会导致重要数据丢失。本文…

关于SQL

数据库简介: 数据库分类 关系型数据库模型: 优点:易于维护,可以实现复杂的查询 缺点:海量数据 读取写入性能差,高并发下数据库的io是瓶颈 是把复杂的数据结构归结为简单的二元关系(即二维表…