Pandas基础学习-CDA学习打卡

news/2025/2/21 18:41:21/文章来源:https://www.cnblogs.com/w-j-q/p/18729828

Pandas

Pandas 是一个开源的 Python 数据分析库,它提供了高性能、易用的数据结构和数据分析工具。Pandas 的设计理念是让数据处理和分析工作在 Python 中变得更加容易。以下是 Pandas 的一些关键特性:

数据结构

Series:一维数组,类似于 Python 的列表,但是每个元素都有一个索引。

DataFrame:二维表格结构,类似于 Excel 或 SQL 表,每列可以是不同的数据类型。

Panel:三维数组,较少使用,主要在处理多维度数据时使用。

常用功能

数据导入:支持多种数据格式,如 CSV、Excel、SQL、HDF5 等。

数据清洗:缺失值处理、重复值处理、数据类型转换等。

数据筛选:基于条件筛选数据。

数据分组:类似于 SQL 的分组功能,支持聚合、转换等操作。

数据合并:支持多种方式的合并(merge)、连接(join)操作。

时间序列处理:提供强大的时间序列处理功能。

文本数据处理:字符串操作、正则表达式等。

数据类型 Series

Series:一维数组。

import pandas  as pd
s = pd.Series([2,3,5,7,11],name='A')
s
0     2
1     3
2     5
3     7
4    11
Name: A, dtype: int64
# 以时间为索引的Seriesdts1 = pd.DatetimeIndex(['2024-01-01 00:00:00','2024-01-01 03:00:00','2024-01-01 06:00:00'])
dts1
DatetimeIndex(['2024-01-01 00:00:00', '2024-01-01 03:00:00','2024-01-01 06:00:00'],dtype='datetime64[ns]', freq=None)
# 另一种写法 pd.date_range可以按一定的频率生成时间序列dts2 = pd.date_range(start = '2024-01-01',periods=6,freq='3H')
dts2
DatetimeIndex(['2024-01-01 00:00:00', '2024-01-01 03:00:00','2024-01-01 06:00:00', '2024-01-01 09:00:00','2024-01-01 12:00:00', '2024-01-01 15:00:00'],dtype='datetime64[ns]', freq='3H')
dts3 = pd.date_range('2024-01-01',periods=6,freq='d')
dts3
DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04','2024-01-05', '2024-01-06'],dtype='datetime64[ns]', freq='D')

数据类型 DataFrame

DataFrame:二维的表格数据结构,可以理解为Series的容器,既有行索引,又有列索引。

# 从字典 创建DataFrame
d = {'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}df = pd.DataFrame(data=d)
df
ABC
0147
1258
2369
# 从列表创建DataFrame
d = [[4,7,10],[5,8,11],[6,9,11]]df1 = pd.DataFrame(data=d,index=['a','b','c'],columns=["A","B","C"]
)df1
ABC
a4710
b5811
c6911
# 从数组创建DataFrame# 数组(array)
import numpy as np
d = np.array([[1,2,3],[4,5,6],[7,8,9]])
df2 = pd.DataFrame(data = d,index=["a","b","c"],columns=["A","B","C"]
)
df2
ABC
a123
b456
c789

数据查看

import numpy  as np
import pandas as pd
d = np.array([[81,2,34,99],[7,4,5,6],[8,9,5,11],[89,3,5,8],[9,2,34,9]])
df = pd.DataFrame(data =d,columns=list("abcd"))
df
abcd
08123499
17456
289511
389358
492349
# 查看前几行
df.head(2)
abcd
08123499
17456
# 查看后几行
df.tail(2)
abcd
389358
492349
# 随机查看几行
df.sample(2)
abcd
492349
389358
# 按列选取
df["a"]
0    81
1     7
2     8
3    89
4     9
Name: a, dtype: int32

条件查询

d = np.array([[81,2,34,99],[7,4,5,6],[8,9,5,11],[89,3,5,8],[9,2,34,9]])
df = pd.DataFrame(data =d,columns=list("abcd"))
df
abcd
08123499
17456
289511
389358
492349
# 单一条件
df[df["a"]>60]
abcd
08123499
389358
df.loc[df["a"]>60]
abcd
08123499
389358
# 单一条件 & 多列
df.loc[df["a"]>60,["a","b","d"]]
abd
081299
38938
# 多条件
df[(df["a"]>20) & (df["b"]>1)]
abcd
08123499
389358
# 多条件筛选行 & 指定列筛选列
df.loc[(df["a"]>60)&(df["b"]>2),["a","b","d"]]
abd
38938
# 多条件筛选行 & 指定列筛选列
df.loc[(df["a"]>60)&(df["b"]>3),["a","b","d"]]
abd

数学计算

import pandas as pd
import numpy as np
d = np.array([[81,28,24,25,96],[8,35,56,98,39],[13,39,55,36,3],[70,54,69,48,12],[63,80,97,25,70]])
df =pd.DataFrame(data=d,columns=list("abcde"))
df
abcde
08128242596
1835569839
2133955363
37054694812
46380972570

聚合计算

聚合计算:是指对数据进行汇总和统计的操作。常用的聚合计算方法包括计算均值、求和、最大值、最小值、计数等。

df["a"].mean()
47.0
df["a"].sum()
235
df["a"].max()
81
df["a"].min()
8
df["a"].count()
5
df["a"].median() # 中位数
63.0
df["a"].var() # 方差
1154.5
df["a"].skew()  # 偏度
-0.45733193928530436
df["a"].kurt() # 峰度
-2.9999915595685325
df["a"].cumsum() # 累计求和
0     81
1     89
2    102
3    172
4    235
Name: a, dtype: int32
df["a"].cumprod() # 累计求积
0          81
1         648
2        8424
3      589680
4    37149840
Name: a, dtype: int32
df["a"].diff() # 差分
0     NaN
1   -73.0
2     5.0
3    57.0
4    -7.0
Name: a, dtype: float64
df["a"].mad() # 平均绝对值
29.2

按行、列聚合计算

df.sum(axis=0)  # 按列汇总求和
a    235
b    236
c    301
d    232
e    220
dtype: int64
df.sum(axis=1) # 按行汇总求和
0    254
1    236
2    146
3    253
4    335
dtype: int64
df.describe() # 描述性统计
abcde
count5.0000005.0000005.0000005.0000005.000000
mean47.00000047.20000060.20000046.40000044.000000
std33.97793420.65671826.39507530.36939239.083244
min8.00000028.00000024.00000025.0000003.000000
25%13.00000035.00000055.00000025.00000012.000000
50%63.00000039.00000056.00000036.00000039.000000
75%70.00000054.00000069.00000048.00000070.000000
max81.00000080.00000097.00000098.00000096.000000

agg函数

对整个DataFrame批量使用多个聚合函数

df.agg(["sum","mean","max","min","median"]) # 默认按照列
abcde
sum235.0236.0301.0232.0220.0
mean47.047.260.246.444.0
max81.080.097.098.096.0
min8.028.024.025.03.0
median63.039.056.036.039.0
df.agg(["sum","mean","max","min","median"],axis=1)
summeanmaxminmedian
0254.050.896.024.028.0
1236.047.298.08.039.0
2146.029.255.03.036.0
3253.050.670.012.054.0
4335.067.097.025.070.0

对DataFrame的某些列应用不同的聚合函数

df.agg({"a":["max","min"],"b":["sum","mean"],"c":["median"]})
abc
max81.0NaNNaN
min8.0NaNNaN
sumNaN236.0NaN
meanNaN47.2NaN
medianNaNNaN56.0

apply、applymap、map函数

注:applymap函数在新版已被弃用,这里的案例是基于pandas==1.3.2写的

在Python 中如果想要对数据使用函数,可以借助apply(),applymap(),map()对数据进行转换,括号里面可以是直接函数式,或者自定义函数(def)或者匿名函数(lambda)

1、当我们要对数据框(DataFrame)的数据进行按行或按列操作时用apply()

df.apply(lambda x:x.max()-x.min(),axis=1)  # axis=1 对行数据进行操作
0    72
1    90
2    52
3    58
4    72
dtype: int64
df.apply(lambda x:x.max()-x.min(),axis=0)  # axis=0 对列数据进行操作
a    73
b    52
c    73
d    73
e    93
dtype: int64

2、当我们要对数据框(DataFrame)的每一个数据进行操作时用applymap(),返回结果是DataFrame格式

df.applymap(lambda x:1 if x>60 else 0)  # applymap() 对每一个数据进行操作
abcde
010001
100010
200000
310100
411101

3、当我们要对Series的每一个数据进行操作时用map()

df["a"].map(lambda x : 1 if x >60 else 0)
0    1
1    0
2    0
3    1
4    1
Name: a, dtype: int64

总结

apply() 函数可以在DataFrame或Series上用自定义函数,可以在行或者列上进行操作。

applymap()函数只适用于DataFrame,可以在每个元素上应用自定义函数。

map()函数只适用于Series,用于将每个元素映射到另一个值。

pandas合并连接

在pandas中,有很多种方法可以合并和拼接数据。常见的方法包括:append()、concat()、merge()。

追加(Append)

append()函数用于将一个DataFrame或Series对象追加到另一个DataFrame中。

import pandas as pd
df1 = pd.DataFrame({"A":["a","b"],"B":[1,2]
})
df1
AB
0a1
1b2
df2 = pd.DataFrame({"A":["b","c","d"],"B":[2,3,4]
})
df2
AB
0b2
1c3
2d4
df1.append(df2,ignore_index=True)
C:\Users\Alwen\AppData\Local\Temp\ipykernel_2976\2717680053.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.df1.append(df2,ignore_index=True)
AB
0a1
1b2
2b2
3c3
4d4

合并(Concat)

concat()函数用于沿指定轴将多个对象(比如Series、DataFrame)堆叠在一起。可以沿行或列方向进行拼接。

# 上下堆叠的例子
df1 = pd.DataFrame({"A":["a","b"],"B":[1,2]
})
df1
AB
0a1
1b2
df2 = pd.DataFrame({"A":["b","c","d"],"B":[2,3,4]
})
df2
AB
0b2
1c3
2d4
pd.concat([df1,df2],axis=0) # 上下拼接 按照列进行拼接
AB
0a1
1b2
0b2
1c3
2d4
# 左右堆叠的列子
df1 = pd.DataFrame({"A":["a","b"]})
df1
A
0a
1b
df2 = pd.DataFrame({"B":[1,2],"C":[3,4]
})
df2
BC
013
124
pd.concat([df1,df2],axis=1)  # 左右拼接  按照行拼接
ABC
0a13
1b24

连接(Merge)

merge()函数用于根据一个或多个键将两个DataFrame的行连接起来。类似SQL中的JOIN操作。

数据连接1(pd.merge)

inner 和 outer连接
df1 = pd.DataFrame({"A":["a","b","c"],"B":[1,2,3]
})
df1
AB
0a1
1b2
2c3
df2 = pd.DataFrame({"A":["b","c","d"],"B":[2,3,4]
})
df2
AB
0b2
1c3
2d4
pd.merge(df1,df2,how="inner")
AB
0b2
1c3
pd.merge(df1,df2,how="outer")
AB
0a1
1b2
2c3
3d4

数据连接2(pd.merge)

左右连接 left right
df1 = pd.DataFrame({"A":["a","b","c"],"B":[1,2,3]
})
df1
AB
0a1
1b2
2c3
df2 = pd.DataFrame({"A":["b","c","d"],"C":[2,3,4]
})
df2
AC
0b2
1c3
2d4
pd.merge(df1,df2,how = "left",on="A") # 左连接
ABC
0a1NaN
1b22.0
2c33.0
pd.merge(df1,df2,how="right",on="A")  # 右连接
ABC
0b2.02
1c3.03
2dNaN4
pd.merge(df1,df2,how="inner",on="A") # 内连接
ABC
0b22
1c33
pd.merge(df1,df2,how="outer",on = "A") # 外连接
ABC
0a1.0NaN
1b2.02.0
2c3.03.0
3dNaN4.0

补充1个小技巧

df1[df1["A"].isin(df2["A"])]  # 返回在df1中列"A"的值在df2中国也存在的行
AB
1b2
2c3
df1[~df1["A"].isin(df2["A"])] # 返回在df1中列"A"的值在df2中不存在的行
AB
0a1

pandas分组聚合

分组聚合(group by)顾名思义就是分2步:

1.先分组:根据某列数据的值进行分组。用groupby()对某列进行分组。

2.后聚合:将结果应用聚合函数进行计算。在agg()函数里应用聚合函数被计算结果。如:sum()、mean()、count()、max()、min()等,用于对每个分组进行聚合计算。


import pandas as pd
import numpy as np
import random
df = pd.DataFrame({"A":["a","b","a","b","a","b"],"B":["L","L","M","N","M","M"],"C":[107,177,139,3,52,38],"D":[22,59,38,50,60,82]
})
df
ABCD
0aL10722
1bL17759
2aM13938
3bN350
4aM5260
5bM3882
单列分组

1.对单列分组后应用sum聚合函数

df.groupby("A").sum()
CD
A
a298120
b218191

2.对单列分组后应用单个指定的聚合函数

df.groupby("A").agg({"C":"min",}).rename(columns={"C":"C_min"})
C_min
A
a52
b3

3.对单列分组后应用多个指定的聚合函数

df.groupby("A").agg({"C":"max","D":"min"}).rename(columns={"C":"C_max","D":"D_min"})
C_maxD_min
A
a13922
b17750

两列分组

1.对多列分组后应用sum聚合函数

df.groupby(["A","B"]).sum()
CD
AB
aL10722
M19198
bL17759
M3882
N350

2.对两列进行group后,都应用max聚合函数

df.groupby(["A","B"]).agg({"C":"max"}).rename(columns={"C":"C_max"})
C_max
AB
aL107
M139
bL177
M38
N3

3.对两列进行分组group后,应用max、min聚合函数。

df.groupby(["A","B"]).agg({"C":"max","D":"min"}).rename(columns={"C":"C_MAX","D":"D_MIN"})
C_MAXD_MIN
AB
aL10722
M13938
bL17759
M3882
N350

补充1:应用自定义的聚合函数

df = pd.DataFrame({"A":["a","b","a","b","a","b"],"B":["L","L","M","N","M","M"],"C":[107,177,139,3,52,38],"D":[22,59,38,50,60,82]
})
df
ABCD
0aL10722
1bL17759
2aM13938
3bN350
4aM5260
5bM3882
## 使用自定义的聚合函数计算每个分组的最大值和最小值
def custom_agg(x):return x.max() - x.min()result = df[["B","C"]].groupby("B").agg({"C":custom_agg})
result
C
B
L70
M101
N0

补充2:开窗函数(类似于SQL里面的over partition by):

使用transform函数计算每个分组的均值

# 使用transform函数计算每个分组的均值
df["B_C_std"] = df[["B","C"]].groupby("B")["C"].transform("mean")
df
ABCDB_C_std
0aL10722142.000000
1bL17759142.000000
2aM1393876.333333
3bN3503.000000
4aM526076.333333
5bM388276.333333

补充3:分组聚合拼接字符串pandas实现类似group_concat功能

df = pd.DataFrame({"姓名":["张三","张三","张三","李四","李四","李四"],"科目":["语文","数学","英语","语文","数学","英语"]
})
df
姓名科目
0张三语文
1张三数学
2张三英语
3李四语文
4李四数学
5李四英语

补充:按某列分组,将另一列文本拼接合并

按名称分组,把每个人的科目拼接到一个字符串

# 对整个group对象中的所有列应用join连接元素
(df.astype(str) # # 先将数据全转为字符
.groupby("姓名") #分组
.agg(lambda x : ",".join(x)))[["科目"]] # join 连接元素
科目
姓名
张三语文,数学,英语
李四语文,数学,英语

pandas 数据重塑


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

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

相关文章

利用deepseek,体验ai写代码

vscode利用cline接入火山引擎deepseek,免费体验ai写代码。注册火山引擎,开通deepseek服务进行火山引擎官网https://www.volcengine.com/,进行注册。进入控制台,访问火山方舟在左侧下拉菜单选择开通管理,开通模型,由于我已经开通过R1模型,以DeepSeek-R1-Distill-Qwen-32B…

测试用例编写

模板1:模板2:模板3:二、用例的来源(1)公司就有模板(2)自己设计模板(3)用例管理工具种导出模板三、写用例的核心要素用例编号、用例标题、前置条件、用例步骤,预期结果、优先级(必填)系统名称、模块名称、用例创建时间、用例类型、实际结果、执行时间(非必填项)四…

TEN 现已接入智谱 GLM-Realtime丨社区来稿

就在上周,三星 Galaxy S25 系列全球首发。基于最新 Galaxy AI 的三星 Galaxy S25 系列手机是三星在全球范围内首次推出具有视频通话功能的原生 AI 智能硬件产品。三星 Galaxy S25 系列背后的智谱最新实时音视频通话 GLM-Realtime 模型,今天已经以插件形式接入 TEN。现在你可以…

Canvas._left will be removed, DO NOT USE IT

问题:SignaturePad 手绘板,在电脑端可以绘制,在小程序端绘制以后不显示。开发者工具打印日志:Canvas._left will be removed, DO NOT USE IT.原因:真机使用时确实无法获取该canvas的实例属性_left.解决:通过微信小程序的wx.createSelectorQuery()方法得到query筛选器,通…

实战解析传统发电站智能化改造-第二期(带图带教程)

传统发电站的智能化改造,如同为老工匠配备高科技工具,提升效率与精准度。改造后的发电站兼具传统与智能,更高效、环保,适应现代能源需求。智慧系统搭建平台是连接感知层和应用层的桥梁,将原始数据转化为有价值的信息,为智能决策和应用提供支持。上期介绍了传统发电站改造…

PostgreSQL技术大讲堂 - 第80讲:duckdb数据库

PostgreSQL第80讲:主题:duckdb数据库 内容介绍: 1、duckdb身世之谜 2、duckdb性能为什么秒杀众多数据库 3、安装duckdb时如何跳过众多的坑 4、duckdb的使用和管理 5、duckdb、pg_duckdb、pg三个数据库性能大比拼 主讲老师:CUUG数据库老陈,PG中文社区委员、CCF数据库专委会…

LLM高效推理:KV缓存与分页注意力机制深度解析

随着大型语言模型(LLM)规模和复杂性的持续增长,高效推理的重要性日益凸显。KV(键值)缓存与分页注意力是两种优化LLM推理的关键技术。本文将深入剖析这些概念,阐述其重要性,并探讨它们在仅解码器(decoder-only)模型中的工作原理。https://avoid.overfit.cn/post/db8875…

Nuclei漏洞扫描器:快速、灵活的漏洞检测工具

免责声明 本文旨在介绍有关特定漏洞检测工具或安全风险的详细信息,以帮助安全研究人员、系统管理员和开发人员更好地理解和修复潜在的安全威胁,协助提高网络安全意识并推动技术进步,而非出于任何恶意目的。利用本文提到的漏洞信息或进行相关测试可能会违反法律法规或服务协议…

BUUCTF-Web方向16-20wp

[极客大挑战 2019]PHP 由内容提示应该存在源码备份,常见的如下,一个个尝试 后缀:tar tar.gz zip rar 名字:www web website backup back wwwroot temp访问www.zip,下载下来解压查看index.phpflag.phpclass.php <?php include flag.php;error_reporting(0);class Name{…

【Nginx开发】如何使用Nginx搭建旁路服务器获取客户端IP

一、前言 在实际业务开发过程中,很多时候有记录客户端真实IP的需求,但是从客户端发送的请求往往会经过很多代理服务器,导致后端服务获取的IP为代理以后的IP,不具有业务含义。为了解决这个问题,可以搭建一个旁路服务器,前端在发起请求的时候需要先请求旁路服务器,获取该客…

PyBy2:若依计划任务自动化上线+内存马自动生成v2.0

免责声明 本公众号文章以技术分享学习为目的。由于传播、利用本公众号发布文章而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任。一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!前言 攻防中,遇到一个ruo…

当任务失败时,顶级调度系统如何实现分钟级数据补偿?

一、补数机制的定义与挑战 补数(Backfill) 指在数据管道因系统故障、数据延迟或逻辑错误导致历史任务缺失时,重新调度并执行指定时间范围内的工作流以修复数据缺口。在大数据场景中,补数机制需解决三大核心挑战:复杂依赖链重建:需精准识别历史时间段内任务上下游关系,避…