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

华为使用MicroG安装并使用Google服务教程

鉴于众多华为手机用户因无法使用Google服务而感到不便,我经过多次摸索和测试,总结了一份简单易懂的教程,希望能够帮助到大家。无论是需要使用Google Play商店下载应用,还是需要使用Google服务进行工作和学习,本文将详细介绍如何在华为手机上安装并使用Google服务。二、前置条件软件要求:Aurora Store(替代Google Play商店)、MicroG Companion、MicroG Server(替代Google框架)

weixin_41926602的博客 3万+

pandas的类SQL操作

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

数据森麟 378

Windows 11下Dify安装部署实战指南

本文详细介绍在Windows 11环境下部署开源LLM应用开发平台Dify的完整流程。涵盖环境准备(WSL 2启用、Docker Desktop安装配置)、源码获取、Docker容器化部署、数据库初始化、服务启动验证等核心步骤。包括环境变量配置、性能优化、安全加固、端口冲突解决、数据库连接故障排查等关键技术要点。为开发者提供从零到一的Dify本地化部署实战指南

weixin_44269410的博客 851

【Unity】制作简易三维场景

本文介绍如何制作一个三维场景

CiNian_的博客 5331

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

记一次springboot集成海康威视SDK过程

一开始没有接触过物联网这块,走了很多弯路,后面还是自己一点点摸索出来的。有个项目,需要对海康的门禁设备进行集成,后台统一管理设备,进行设备人脸数据的下发、删除等操作。3.我还接入了门禁设备的事件监听,门禁所有的事件都会上报到后台服务,这块代码有需要的可以找我。在linux系统中,sdk我使用的是绝对路径,把Linux版本的文件放到服务时,Acs文件夹下的 各个Manage都有现成的代码,可以根据自己的需要调用即可。路径也不要有中文,切记!2.sdk的存放路径不要有中文,不然会出现很多奇怪的问题。

huang_xiaoen的博客 2348

Spark基本使用-DataFrame

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

BaideS的博客 1433

近4000张真实城市场景行人数据集:YOLO训练实战指南

行人检测是计算机视觉在智能驾驶与机器人感知中的基础任务,其核心挑战在于模型对真实道路场景的鲁棒性——尤其在小目标、遮挡、光照变化及中国特有交通参与者(如外卖骑手、接娃家长)下的泛化能力。本文围绕轻量化、高覆盖、强落地性的近4000张实采图像,系统阐释如何构建面向YOLO系列模型的高质量训练数据集:从四维场景采样策略(光照-遮挡-尺度-姿态)出发,解析标注规范对检测精度的关键影响,并说明数据增强需服务于真实干扰源(雨痕、动态模糊、对比度衰减),而非盲目堆叠。该数据集专为已掌握YOLO训练流程的算法工程师、嵌入

weixin_32495691的博客 297

地平线旭日X5开发板--搭建ROS1环境开发

由于RDK X5是基于Ubuntu22.04 进行版本释放,而ROS1只兼容到了20.04,为了更很好的做以前ROS1相关代码方案的快速迁移,提供了使用docker 的ros环境,进而使用ros1的方案。

bingdund的博客 1019

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

USB_TYPE-C 母座电路设计

本文详细介绍了USB Type-C接口(C2765186)的电路设计要点,重点解析了电源、识别和数据三部分的关键连接方案。电源部分需并联VBUS和GND引脚并加宽走线以承载3A电流;识别部分必须为CC1/CC2引脚配置5.1kΩ±1%精度的下拉电阻,这是触发PD充电的核心条件;数据部分通过短接正反插引脚实现盲插功能。文档还提供了完整的引脚对照表,并强调PCB布局需注意ESD防护、差分走线阻抗控制等要点,为Type-C接口设计提供了实用指导。

在读研究生,FPGA电路设计与功能开发。 579

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

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

weixin_39953629的博客 325

TPAMI 2025 | 从缺失碎片到杰作:基于上下文自适应扩散的图像修复

图像修复是一项具有挑战性的任务,尤其是要确保生成的内容与图像的现有部分无缝融合。尽管最近的扩散模型展现出了潜力,但它们在保持已知区域和未知(缺失)区域之间的连贯性方面常常遇到困难。这个问题源于扩散过程中缺乏明确的空间和语义对齐,导致生成的内容无法与原始图像平滑融合。此外,扩散模型通常依赖全局学习分布,而非局部特征,这使得生成的图像部分与现有图像部分之间存在不一致。在这项工作中,作者提出了ConFill,这是一个新颖的框架,引入了上下文自适应差异(CAD)模型,以确保在整个扩散过程中,已知区域和未知区域的中间

小白学视觉 239

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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、付费专栏及课程。

余额充值