pandas.DataFrame的类SQL操作

像写SQL一样学习pandas 中 DataFrame 当下python在数据处理以及量化分析数据挖掘上使用越发广泛,本文将针对python中pandas包下的DataFrame这种数据类型的的使用进行详细说明,以及其在数据处理的同等情况下SQL中的对比,话不多说,开整!!! 关键字:pandas、DataFrame、SQL   1、关于数据表列的筛选有DataFrame(也就是二维数据表)data:使用data=DataFrame(np.arange... 阅读详情

前言

pandas的DataFrame是类似于一张表的结构,但是并没有像数据库表那样的SQL操作。虽然如此,它依然可以使用python语言的风格实现SQL中的所有操作。

文章较长,建议点击右侧目录定位到自己感兴趣的章节进行重点阅读。

微信公众号:大数据报文

where、limit、sort by和order by

首先我们讲一些常用的最基本的SQL操作。,首先创建一个DataFrame。

# 首先构建一个df,用于执行相关操作
import numpy as np
import pandas as pd

index = pd.date_range('20191201',periods=30)
df = pd.DataFrame(np.random.randn(30,7),index=index,columns=['Sun','Mon','Tues','Wed','Thur','Fri','Set'])
# 查询df表中,12月前五天工作日的所有数据
# sql:select Mon, Tues, Wed, Thur, Fri from df limit 5;
# pandas DataFrame方式
df[['Mon','Tues','Wed','Thur','Fri']].head() # 默认取前5
'''
			Mon			Tues		Wed			Thur		Fri
2019-12-01	0.804610	0.368983	-0.601083	-1.245074	-0.484798
2019-12-02	1.260151	-1.409303	-0.634084	-1.036428	2.090475
2019-12-03	-1.728074	0.906895	0.015032	-1.311078	-1.329503
2019-12-04	-0.489368	-1.285120	-0.115737	0.138407	-1.360219
2019-12-05	-0.686239	-0.715345	-1.216979	-0.110652	-0.716998
'''
# 使用where条件,过滤大于Mon大于1的行,并且是工作日的列,并按照Mon降序排序,去除前五行
# SQL:select Mon,Tues,Wed,Thur,Fri from df where Mon > 0 order by Mon desc limit 5;
df[df['Mon'] > 1][['Mon','Tues','Wed','Thur','Fri']].sort_values('Mon',ascending=False).head()
'''
			Mon			Tues		Wed			Thur		Fri
2019-12-24	3.428393	-0.117491	-1.050417	0.013496	0.744957
2019-12-22	2.264095	0.580407	1.992808	0.277741	0.691637
2019-12-18	1.919169	1.108332	1.135021	0.468483	0.718493
2019-12-29	1.442418	-0.555409	1.483127	-0.322987	0.480643
2019-12-11	1.304989	0.289543	0.591583	-0.420857	-0.407957
'''

where多条件查询

and条件

# where中有多个条件,要注意两个条件如果是and用&,且条件要用小括号包裹一下
# select * from df where Sun > 0 and Mon < 0 order by Sun desc;
df[(df['Sun'] > 0) & (df['Mon'] < 0)].sort_values('Sun',ascending=False)
'''
			Sun			Mon			Tues		Wed			Thur		Fri		Set
2019-12-04	2.196878	-0.489368	-1.285120	-0.115737	0.138407	-1.360219	0.093402
2019-12-25	1.245318	-2.336478	0.166749	0.665577	-1.740905	-0.719664	0.011632
2019-12-21	0.984376	-0.395367	0.859675	0.035257	-0.326325	2.049639	-0.104049
2019-12-20	0.916271	-2.208159	0.680670	-1.392549	0.310099	-0.655601	1.008948
2019-12-08	0.680180	-0.682509	0.263885	0.270527	0.428712	-0.566694	-0.426841
2019-12-03	0.552253	-1.728074	0.906895	0.015032	-1.311078	-1.329503	-1.179729
'''

or条件

 # or条件,在DataFrame中使用的是按位或符号:|
 # sql: select * from df where Sun > 1 or Set > 1 order by Sun;
 df[(df['Sun'] > 1) | (df['Set'] >1)].sort_values('Sun',ascending=False)
 '''
             Sun         Mon         Tues        Wed         Thur        Fri     Set
 2019-12-19  2.200183    1.126807    1.650156    0.165897    1.262572    1.083929    2.151953
 2019-12-04  2.196878    -0.489368   -1.285120   -0.115737   0.138407    -1.360219   0.093402
 2019-12-25  1.245318    -2.336478   0.166749    0.665577    -1.740905   -0.719664   0.011632
 2019-12-07  1.189126    0.115880    0.237899    -0.265956   0.882976    -0.932736   0.385194
 2019-12-20  0.916271    -2.208159   0.680670    -1.392549   0.310099    -0.655601   1.008948
 2019-12-14  0.063325    0.553131    0.221180    0.265838    0.260798    1.100413    1.112681
 '''

空值查询

在DataFrame中判断空值使用isna()和notna()两个方法

# 先构造一个带空置的DataFrame
dfna = pd.DataFrame({
    "one":pd.Series([1,2,3,np.NaN,5,6]),
    "two":pd.Series([1,2,np.NaN,5,6,np.NaN]),
    "three":pd.Series([np.NaN,5,6,np.NaN,7,8]),
})

# 查询three列不是空值的全部数据
# SQL:select * from dfna where three is not null;
dfna[dfna['three'].notna()]
'''
	one	two	three
1	2.0	2.0	5.0
2	3.0	NaN	6.0
4	5.0	6.0	7.0
5	6.0	NaN	8.0
'''
# 查询表中three是空值的全部列
# SQL:select * from dfna where three is null;
dfna[dfna['three'].isna()]
'''
	one	two	three
0	1.0	1.0	NaN
3	NaN	5.0	NaN
'''

分组

  • 先创建一个表,用于分组测试用

  • DataFrame的分组与SQL最大的不同时,SQL只能对分组列进行聚合,但是DataFrame不止可以对分组列聚合,其他列只要可以进行聚合操作都可以进行聚合

  • DataFrame可以对多列进行不同类型的聚合运算,需要使用agg函数并传入一个dict对象

  • 可以使用多列作为条件进行分组

# 人员基本信息表
fdf = pd.DataFrame({
    "name":pd.Series(['Zero','Zoey','Bella','Kat','Sid']),
    "age":pd.Series([23,24,23,26,23]),
    "gender":pd.Series(['male','female','female','female','male']),
    "address":pd.Series(['jinan','nanjing','qingdao','dongjing','dongjing']),
    "salary":pd.Series([8888.8,6666.6,1234.5,2345.6,5678.9])
})

# 按性别分组,求出男女的平均工资
fdf.groupby('gender').mean()['salary']
'''
gender
female    3415.566667
male      7283.850000
Name: salary, dtype: float64
'''

#求出男女人数
fdf.groupby('gender').size()
'''
gender
female    3
male      2
dtype: int64
'''

# 分组后对不同列进行不同类型的聚合
# 按照gender进行分组,对salary求平均值,对age求总数
fdf.groupby('gender').agg({'salary':np.mean, 'age':np.size})
'''
		salary		age
gender		
female	3415.566667	 3
male	7283.850000	 2
'''

JOIN

  • join跟sql一样支持左外、右外,全外和内连接四种连接

  • 先创建两个df用于进行join操作

  • DataFrame可以使用join()和merge()两种函数进行join操作,这里使用merge进行测试

# 创建两个待join的表
df1 = pd.DataFrame({
    "key":['A','B','C','D','E'],
    "val":np.random.randn(5)
})
df2 = pd.DataFrame({
    "key":['C','B','F','H','D'],
    "val":pd.Series(np.random.randn(5))
})

# 根据key列进行join操作,内连接
df1.merge(df2,on='key')
# 右外连接
df1.merge(df2, on='key', how='right')
# 左外连接
df1.merge(df2, on='key', how='left')
# 全外连接
df2.merge(df2, on='key', how='outer')
# 全外,上面的全外不是真的全外,要用这种方式才能做到全外连接
pd.merge(df1, df2, on='key',how='outer')

Union

  • union操作使用concat()进行完成

  • concat是pandas的函数笔试dataframe的函数

  • concat接受一个数组作为入参,所以在进行union的时候,需要将多个df放入一个数组中

# 合并两个DataFrame并去重
pd.concat([df1, df2]).drop_duplicates()
'''
key	val
0	A	-0.309694
1	B	1.455732
2	C	0.436620
3	D	0.970044
4	E	-0.689002
0	C	0.405784
1	B	-0.522076
2	F	0.147848
3	H	-1.609153
4	D	1.205187
'''

添加一列

df1.assign(score=np.random.randint(60,100,size=5))
'''
key	val	score
0	A	-0.309694	80
1	B	1.455732	92
2	C	0.436620	92
3	D	0.970044	95
4	E	-0.689002	89
'''

top N 相关函数

  • 在DataFrame中有直接求top N的函数

  • nlargest(n,col)求col列中前n大的行

  • nsmallest(n,col)求col列中前n小的行

df.nlargest(3,columns='Sun')
df.nsmallest(3,columns='Sun')

# 这里也是top N,但是是基于分组的top N
# assign是添加一列
# 添加的列叫rn
# sort_values是对salary进行排序
# groupby是对gender进行分组
# cumcount是按照上面给定的顺序从0开始给一个顺序号

fdf.assign(
    rn=fdf.sort_values(['salary'], ascending=False)
    .groupby(['gender'])
    .cumcount()+1
).sort_values('name')

# 下面的结果说明了男女中工资从低到高的排序顺序
'''
	name	age	gender	address	salary	rn
2	Bella	23	female	qingdao	1234.5	3
3	Kat	26	female	dongjing	2345.6	2
4	Sid	23	male	dongjing	5678.9	2
0	Zero	23	male	jinan	8888.8	1
1	Zoey	24	female	nanjing	6666.6	1
'''

总结

pandas是一个非常强大的科学计算库,DataFrame的功能也远不止这么简单。这里只是总结了一些常用的类似于SQL的操作方法。如果需要更加复杂的功能可以查看DataFrame的官方文档。

【Pandas+SQL完全指南】10种数据库无缝集成技巧 | 数据分析效率翻倍 在现代数据分析中,我们经常需要处理存储在数据库中的大量数据。Pandas 作为 Python 数据分析的核心库,提供了与各种数据库系统无缝集成的能力,使数据科学家和分析师能够轻松地在 Python 环境中分析数据库数据。本文将详细介绍如何结合 Pandas 和 SQL,建立高效的数据分析流程。 阅读详情

相关推荐

Pyspark中DataFrame与pandas中DataFrame之间的相互转换

Pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换: # pandas转spark values = pandas_df.values.tolist() columns = pandas_df.columns.tolist() spark_df = spark.createDataFrame(values, columns) # spark转pand...

给我一点温度 1万+

使用SQL来操作DataFrame?我们给pandas找了个新搭子

使用sql来操作DataFrame,这是一个令人感兴趣的话题

量化风云 2088

【Pandas】pandas DataFrame to_sql

`pandas.DataFrame.to_sql()` 是 Pandas 提供的用于将 DataFrame 写入 SQL 数据库的方法。它支持多种数据库后端(如 SQLite、PostgreSQL、MySQL 等),通过 SQLAlchemy 引擎实现跨数据库兼容性。

weixin_39648905的博客 1227

pandas:sql能的,我都能!!!

通常我们用sql处理数据库里的数据,其实sql对数据的操作,在pandas中完全可以实现。接下来,让我们根据sql执行顺序,来依次看看pandas对应的方法。

youzi85的博客 2836

【Pandas】pandas DataFrame merge

`pandas.DataFrame.merge()` 是 Pandas 中用于**基于一个或多个键将两个 DataFrame 进行数据库风格的合并(join)**的方法。它类似于 SQL 中的 JOIN 操作,支持多种连接方式(如 `inner`, `left`, `right`, `outer`),并可以指定左右 DataFrame 的连接键。

weixin_39648905的博客 1187

【Pandas】pandas DataFrame resample

`pandas.DataFrame.resample()` 是 Pandas 中用于**对时间序列数据进行重采样(resampling)**的核心方法。它类似于 SQL 中的“GROUP BY 时间窗口”操作,常用于将高频时间序列数据聚合为低频(如从分钟级到小时级、日级等),也支持升采样(插值填充)。

weixin_39648905的博客 1118

PANDAS DATAFRAME实现类SQL操作

引自:https://pandas.pydata.org/pandas-docs/stable/getting_started/comparison/comparison_with_sql.html Comparison with SQL Since many potential pandas users have some familiarity with SQL, this page is m...

NAZCA2003的博客 445

爬虫风控实战:当你的代理IP被数美滑块盯上时,如何优雅破解?

本文深入探讨了爬虫风控对抗中数美滑块验证码的破解与防御策略。通过分析数美滑块的多层防御机制,提出了代理IP池精细化管理、请求特征拟人化改造以及工程化滑块验证解决方案等系统性方法,帮助开发者有效降低验证码触发率,提升爬虫效率。

weixin_27419879的博客 206

pandas的类SQL操作

公众号后台回复“图书“,了解更多号主新书内容作者:livan来源:数据python与算法会写python不难,写好却需要下一番功夫,上篇文章写了for循环的简单优化方法,原本想一鼓...

数据森麟 378

wsl2内核版本和模块版本不一致解决方法

** /lib/modules/…build: No such file or directory错误解决办法这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。

m0_60634555的博客 5103

使用 ArxivLoader 从 arXiv 加载学术文献并实现高效文档处理

arXiv是一个开放获取的学术存储平台,涵盖了物理、数学、计算机科学等多个领域的 200 万篇学术论文。这些文献中包含了如逻辑推理、机器学习等热门领域的最新研究进展。通过使用 ArxivLoader,我们可以轻松地搜索和加载 arXiv 上的学术文献,并将其转换为文本以供分析或应用于下游任务,例如问答系统、摘要生成或知识图谱构建。有时我们并不需要完整的文献内容,而是只需要摘要用于快速预览。可以使用 get_summaries_as_docs()# 获取文献摘要# 查看第一篇摘要。

hgSdaegva的博客 888

pythonpandas代码_Python pandas DataFrame操作的实现代码

1. 从字典创建Dataframe>>> import pandas as pd>>> dict1 = {'col1':[1,2,5,7],'col2':['a','b','c','d']}>>> df = pd.DataFrame(dict1)>>> dfcol1 col20 1 a1 2 b2 5 c3 ...

weixin_39843338的博客 275

把 ABAP ALV 表头做成两层分组:用 TOP-OF-PAGE 手工绘制双行列标题

摘要:本文介绍了在SAP ALV List中实现双层表头的方法。通过关闭系统默认列标题(no_colhead='X'),在TOP_OF_PAGE事件中手动绘制表头,使用sy-uline和sy-vline绘制线条实现分组效果。关键点包括:1)关闭系统表头;2)在事件处理中分两行输出分组标题和字段名;3)利用系统自动拼接线条的特性绘制表格边框。文中还指出了常见问题如线条自动粘连、颜色不生效等,并提供了完整示例代码和详细解释。这种方法适用于需要对字段进行业务分组的报表场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 257

Spark基本使用-DataFrame

基本使用说明 Spark是一个计算框架,其最简单的对数据的处理方法是对DataFrame,虽然功能有限,但是对于非特大的数据量,也基本上够用了,故此处记录DataFrame的处理方法; 创建DataFrame的通用前提及方法; 创建SparkSession的实例; 由SparkSession的实例去创建DataFrame; 操作DataFrame的两种方式; 类pandas方法; 类SQL方法; 简单的性能优化; 写好脚本后,如何提交; 用spark-submit提交的方法; 创建Da

BaideS的博客 1433

Joule 终于会说 ABAP 了:从 ADT 提效到 ABAP AI SDK + ISLM 自建企业级 AI 场景的落地路线

生成结构化摘要(故障现象、初步原因、处理动作、备件消耗)自动给出建议分类(电气、机械、软件、网络)把摘要回写到工单抬头,方便后续统计与知识沉淀如果你用 CAP 来做这类服务,通常会在 Node.js 层封装一个对 AI Hub 的调用,再通过 OData 或 Event 把结果写回 SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

Claude Code 处理长任务 + Cursor 专注交互:双栈协作的 3 种分工场景与响应提速 35% 实测

揭示 Claude Code 与 Cursor 在 AI 编程中的本质分工:Claude Code 作为离线式架构师处理跨文件、带约束的长链路重构(如单体拆微服务),Cursor 作为现场交互工程师专注秒级局部编辑;提出按任务切片动态切换的三种工程化协作场景,并给出结构化上下文构建、约束型 Prom

weixin_28728443的博客 122

python to sql_Python Pandas to_sql,如何用主键创建表?

I would like to create a MySQL table with Pandas' to_sql function which has a primary key (it is usually kind of good to have a primary key in a mysql table) as so:group_export.to_sql(con = db, name =...

weixin_39640909的博客 839

在 RAP 里把编号这件事做得既优雅又合规:Early Numbering 与 Late Numbering 的落地指南

本文探讨了 SAP RAP 框架中的三种主键编号策略及其适用场景。文章首先指出传统 ABAP 应用中主键处理的局限性,详细分析了早期编号(外部/内部)和延迟编号的差异,强调延迟编号在避免业务断号方面的优势。通过 Partner 业务对象案例,文章演示了延迟编号的实现方法,包括行为定义配置、保存类实现和编号分配逻辑。同时指出测试中常见的校验陷阱,并提醒生产环境应避免简单的 MAX+1 方案,建议采用原子取号机制确保并发安全。全文从业务合规性和技术实现两个维度,为 RAP 应用的编号策略选择提供了实用指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1841

sql concat函数_数据分析工具篇——pandas的类SQL操作

会写python不难,写好却需要下一番功夫,上篇文章写了for循环的简单优化方法,原本想一鼓作气,梳理一下for循环优化的高级方法,但是梳理过程中发现for循环优化需要比较多的python基础知识,如果了解不透彻很难达到优化的效果,因此,笔者想用几个短篇先介绍一下python的常用包和方法,方便后续优化使用。这篇文章我们先来了解一下pandas包中的类SQL操作,pandas中基本...

weixin_39953629的博客 325

[PCIe5.0] 2.2.7.1 TPH Rules

TPH 机制通过硬件提示优化数据流,适用于高性能计算和存储场景。

系统固件工程师 349

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python to sql,Python Pandas to_sql,如何用主键创建表?

I would like to create a MySQL table with Pandas' to_sql function which has a primary key (it is usually kind of good to have a primary key in a mysql table) as so:group_export.to_sql(con = db, name =...

weixin_31256683的博客 447

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

pandas 入门:DataFrame的创建,读写,插入和删除

本文介绍了Pandas创建和读取DataFrame的核心操作方法。主要内容包括:1)通过读取CSV/Excel文件、字典、数组或创建空DataFrame四种方式构建DataFrame;2)使用列名、列号或.loc/.iloc方法按列读取数据;3)通过行标签(.loc)、行号(.iloc)或已弃用的.ix方法按行读取数据;4)使用双重索引或.loc[row,col]格式按单元格精确读取数据。文章通过代码示例详细演示了各种操作方法的区别与适用场景,特别强调了索引设置对数据读取的影响,是Pandas基础操作的实用

不去想结果,一直在路上 30万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pandas DataFrame.to_sql() 用法

pandas DataFrame.to_sql() 用法 to_sql() 的语法如下: # https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html DataFrame.to_sql(name, con, schema=None, if_exists='fail', inde...

王敏的专栏 6万+

Pandas模块中的DataFrame数据操作

将Excel中的数据读入Pandas模块中的DataFrame结构,然后对数据进行增删查改等操作。

天际 4421

Pandas——DataFrame操作

df[(df['区域'].isin(['望京租房','回龙观租房'])) & (df['朝向'].isin(['西南 东北','南 北'])) ]df_head['区县'] = ['朝阳区','朝阳区','西城区','昌平区','朝阳区'] # 传入列表长度和df长度必须一致。charset=utf8'区别,insert可以指定插入的位置编号, df['新列名'] = ’新值‘ 插入的新列在df的最后。df.rename(index = {'老值':'新值'},columns={'老值':'新值'})

Ashenlex的博客 2436
上一篇: pandas连接Mysql和Oracle数据库构建DataFrame
下一篇: 【转】Java NIO 系列教程
iFence
博客等级 码龄9年 8051粉丝 111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值