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

kettle信息发送钉钉

由于其他的作业比较多,想要在job中加入一个转化发送消息到钉钉,其他的配置说明直接获取系统的信息。这样也避免直接修改其他的转换和大量的工作量。 步骤: 1、新建一个转换 拉取获取系统信息、获取变量、JavaScript代码、获取access_token组件。 2、获取系统信息设置 拿到需要的信息,比如作业的读写更新删除行数,job的日志内容 这个日志内容同在作业执行页面下输出的日志,所以可以在执行作业时选择是详细日志、基本日志还是错误日志。 3、获取变量 获取变量主要是想要去拿到job的名称,文件名。按

Deng_7788的博客 1446

pandas的类SQL操作

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

数据森麟 378

手把手排查IOMMU映射故障:从内核日志到硬件寄存器调试全指南

本文详细解析了IOMMU映射故障的排查方法,从内核日志分析到硬件寄存器调试,提供了一套完整的诊断流程。涵盖AMD和Intel平台的特定调试技巧,包括ATS协商失败、DMA传输错误等常见问题的解决方案,并介绍了高级调试工具链的搭建与性能优化策略。

weixin_42666036的博客 353

保姆级教程:用QSTEM和DrProbe搞定你的第一张STEM模拟图(附Fe3O4实例文件)

本文提供了一份详细的STEM模拟图像生成教程,涵盖从晶体结构获取到最终图像模拟的全过程。通过QSTEM和DrProbe软件的操作指南,帮助材料科学研究者快速掌握STEM模拟技术,特别适合初学者。教程包含Fe3O4实例文件,详细解析参数设置、计算优化和结果分析等关键步骤。

weixin_33730836的博客 523

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

VS2017中调用gdal(C#版)的方法二(含gdal下载地址,配置过程,代码测试,超详细!!)

VS2017中gdal(C#)版的配置与测试 上次记录了直接在VS2017中下载并应用gdal的方法,这次来记录一下网上下载的安装包配置与测试的方法。 一、环境、版本及下载地址 win10,vs2017社区版,gdal2.4.4 还是像之前在Unity中应用gdal一样,最好是下载已经编译好的C#版的gdal,不然自己配置真的很容易出错,我就是这样的,下面提供不同版本的gdal下载地址: 1.GDAL2.4.4(C#版、64位): https://download.csdn.net/download/che

chengbaola的博客 1365

Spark基本使用-DataFrame

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

BaideS的博客 1433

Python遥感图像处理指南(2)-卫星影像分析MNDWI提取

在第一篇文章中,我们使用了我们导入的软件包中已定义的函数,如 rasterio 中的 open 和 read 以及 matplotlib 中的 imshow。现在,我们可以编写自己的函数了。函数是一段代码,它接收一些参数作为输入并返回输出(经过一些计算),可以在代码中多次重复使用,也可以被其他代码重用。在 Python 中定义一个新函数非常简单。return v在此语法示例中,arg1和arg2强制参数,应该传递给函数,否则会引发错误,而arg3是一个可选参数,如果是,则假定默认值 1从函数调用中省略。

gis收藏家的博客 1575

使用MeshLab高效对齐3D模型:从OBJ导入到坐标修正全流程

本文详细介绍了使用MeshLab高效对齐3D模型的全流程,涵盖从OBJ导入、坐标修正到最终导出的核心步骤。通过将模型中心归位至坐标原点,并利用主轴对齐功能快速摆正模型,为后续的3D打印、体素化等处理奠定精确的几何基础。

weixin_29313423的博客 92

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

用 YOLOv11‑Seg 做工地实例分割:从 0 起步到效果调优,真香!

这不是一篇“官方文档翻译”,而是一篇。

weixin_43199439的博客 776

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

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

weixin_39953629的博客 325

在MATLAB中将C语言代码转化为可执行的mexw64文件

这样,您可以将高效的C语言算法集成到MATLAB环境中,以便更好地利用MATLAB的功能和特性。请记住,在使用mex转换C语言代码之前,您需要正确编写和测试C语言代码,并确保它与MATLAB的mex接口兼容。MATLAB是一种功能强大的数值计算软件,它提供了一个机制,可以将C语言代码转化为MATLAB可执行的mexw64文件。在上述命令中,"-output"选项指定生成的mex文件的名称,"myfunction"是您选择的名称,"myfunction.c"是要编译的C语言源文件。步骤1:编写C语言代码。

CodeRoarX的博客 1427

数学建模模型总结

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

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

余额充值