爱了!爱了!一款用 pandas 玩转 SQL 的神器

来自公众号:数据分析与统计学之美

1. 演示数据

本文的所有演示数据,均是基于下方的四张表。下面这四张表大家应该不陌生,这就是网传50道经典MySQL面试题中使用到的几张原表。关于下方各表之间的关联关系,我就不给大家说明了,仔细观察字段名,应该就可以发现。

2. pandasql的使用

1)简介

pandas中的DataFrame是一个二维表格,数据库中的表也是一个二维表格,因此在pandas中使用sql语句就显得水到渠成,pandasql使用SQLite作为其操作数据库,同时Python自带SQLite模块,不需要安装,便可直接使用。

这里有一点需要注意的是:使用pandasql读取DataFrame中日期格式的列,默认会读取年月日、时分秒,因此我们要学会使用sqlite中的日期处理函数,方便我们转换日期格式,下方提供sqlite中常用函数大全,希望对你有帮助。

sqlite函数大全http://suo.im/5DWraE

导入相关库:

import pandas as pd
from pandasql import sqldf
2)声明全局变量的2种方式
  • ① 在使用之前,声明该全局变量;

  • ② 一次性声明好全局变量;

① 在使用之前,声明该全局变量
df1 = pd.read_excel("student.xlsx")
df2 = pd.read_excel("sc.xlsx")
df3 = pd.read_excel("course.xlsx")
df4 = pd.read_excel("teacher.xlsx")


global df1
global df2
global df3
global df4query1 = "select * from df1 limit 5"
query2 = "select * from df2 limit 5"
query3 = "select * from df3"
query4 = "select * from df4"

sqldf(query1)
sqldf(query2)
sqldf(query3)
sqldf(query4)

部分结果如下:

② 一次性声明好全局变量
df1 = pd.read_excel("student.xlsx")
df2 = pd.read_excel("sc.xlsx")
df3 = pd.read_excel("course.xlsx")
df4 = pd.read_excel("teacher.xlsx")

pysqldf = lambda q: sqldf(q, globals())

query1 = "select * from df1 limit 5"
query2 = "select * from df2 limit 5"
query3 = "select * from df3"
query4 = "select * from df4"

sqldf(query1)
sqldf(query2)
sqldf(query3)
sqldf(query4)

部分结果如下:

3)写几个简单的SQL语句
① 查看sqlite的版本
student = pd.read_excel("student.xlsx")
pysqldf = lambda q: sqldf(q, globals())
query1 = """
    select sqlite_version(*)
"""
pysqldf(query1)

结果如下:

② where筛选
student = pd.read_excel("student.xlsx")
pysqldf = lambda q: sqldf(q, globals())
query1 = """
    select * 
    from student 
    where strftime('%Y-%m-%d',sage) = '1990-01-01'
"""
pysqldf(query1)

结果如下:

③ 多表连接
student = pd.read_excel("student.xlsx")
sc = pd.read_excel("sc.xlsx")


pysqldf = lambda q: sqldf(q, globals())
query2 = """
    select *
    from student s
    join sc on s.sid = sc.sid
"""
pysqldf(query2)

部分结果如下:

④ 分组聚合
student = pd.read_excel("student.xlsx")
sc = pd.read_excel("sc.xlsx")


pysqldf = lambda q: sqldf(q, globals())
query2 = """
    select s.sname as 姓名,sum(sc.score) as 总分
    from student s
    join sc on s.sid = sc.sid
    group by s.sname
"""
pysqldf(query2)

结果如下:

⑤ union查询
student = pd.read_excel("student.xlsx")
pysqldf = lambda q: sqldf(q, globals())
query1 = """
    select * 
    from student 
    where strftime('%Y-%m',sage) = '1990-01'
    union
    select * 
    from student 
    where strftime('%Y-%m',sage) = '1990-12'
"""
pysqldf(query1)

结果如下:

------end------

<think>好的,用户现在是大一遥感专业的学生,学习数据库的主要目的是为了更好地将地理信息知识和计算机结合,暂时不急着面试。我需要根据之前的对话历史,继续提供适合他的建议。 首先,用户之前已经得到了一些通用的数据库学习建议,现在需要更具体地结合遥感和地信的需求。可能需要强调数据库在地理信息中的应用场景,比如空间数据管理、遥感影像存储等。 然后,用户作为大一学生,可能更关注如何将数据库与现有专业课程结合,避免学习过于理论或计算机专业的内容。需要推荐一些实际应用案例,比如使用PostGIS处理地理数据,或者结合Python进行数据分析。 还要考虑用户提到的“不急着面试”,所以学习资源应该偏向实用和项目实践,而不是面试准备。可以建议一些适合初学者的工具和库,比如QGIS、GDAL,以及如何用SQL管理空间数据。 另外,可能需要提醒用户注意空间数据库的特殊性,比如空间索引、坐标系统,这些在普通数据库中可能不涉及,但对地信非常重要。同时,结合编程语言如Python或JavaScript,展示数据库在GIS开发中的应用。 最后,保持轻松语气,鼓励用户从实际项目入手,比如开发简单的地图应用或数据分析项目,逐步积累经验。可能还需要推荐一些社区和资源,帮助他找到学习的方向和支持。</think>哈哈,遥感+地信+数据库?这个组合拳简直酷到没朋友!🌍💻 你未来可能是“用卫星数据拯救世界”的隐藏大佬啊(比如用数据库追踪森林变化、分析城市扩张什么的)。来,咱们直接上「遥感人专属数据库攻略」&mdash;&mdash; --- ### **🌱 阶段一:先抓「遥感+地信」的刚需场景** #### **🔍 灵魂拷问:为什么遥感需要数据库?** - **场景举例**: - 管理海量遥感影像(时间+空间+光谱多维数据,总不能全堆在硬盘里吧?) - 快速查询“某区域过去5年植被指数变化”(没有索引和SQL,Excel会卡到哭) - 结合GIS空间分析(比如用PostGIS做缓冲区查询:“高速公路10公里内的农田”) #### **🚀 行动建议**: 1. **从「空间数据库」入手**: - 工具推荐:**PostgreSQL + PostGIS**(地信界扛把子,开源免费,B站教程一堆) - 新手任务:用SQL查“两个多边形是否相交”、“计算某点的最近邻设施”(比普通SQL多了空间函数!) 2. **玩转「时空数据」**: - 举个栗子🌰: 建一个带时间戳的遥感影像元数据表,包含拍摄时间、范围、卫星类型,然后写SQL查“2023年长江流域所有Landsat影像” - 隐藏技能:学**GeoJSON**格式(很多WebGIS用它传数据),试试用数据库存储和查询GeoJSON --- ### **🔧 阶段二:把数据库变成「遥感工具箱」的一部分** #### **📌 关键联动技能**: - **Python + 数据库**: - 用`geopandas`(地理版Pandas)从数据库读空间数据 → 分析 → 存回数据库 - 代码片段尝鲜: ```python import geopandas as gpd from sqlalchemy import create_engine # 从PostGIS读取数据 engine = create_engine('postgresql://user:密码@localhost:5432/数据库名') gdf = gpd.read_postgis("SELECT * WHERE ST_Area(geometry) > 1000", engine) # 分析后存回数据库 gdf.to_postgis('新表名', engine, if_exists='replace') ``` - **可视化助攻**: - 用QGIS直接连接数据库渲染空间数据(比ArcGIS更轻量) - 用Python的`folium`库把数据库查询结果变成交互式地图 --- ### **🚨 避坑指南:遥感萌新常踩的雷** - **雷区1**:把所有影像文件存数据库 → 数据库爆炸💥 → **正确姿势**:数据库只存影像元数据和路径,文件用文件系统或对象存储(如MinIO) - **雷区2**:忽略坐标系统(CRS) → 空间查询全错位 → **保命口诀**:建表时一定指定SRID(如WGS84=4326),用`ST_Transform`转换坐标系 - **雷区3**:用普通字符串存空间数据 → 无法做空间运算 → **神器推荐**:**PostGIS的geometry类型**,支持点线面+空间关系判断(ST_Intersects、ST_Distance...) --- ### **🎯 实战小项目推荐(从易到难)** 1. **「城市变化监测」迷你版**: - 用数据库存储某城市不同年份的用地类型矢量数据 - 写SQL统计“2020-2023年耕地转建筑用地的面积” - 用Python生成变化热力图 2. **「遥感影像元数据管理系统」**: - 设计表结构:影像时间、范围、分辨率、卫星类型、存储路径... - 实现功能:按区域/时间/卫星筛选影像,导出为CSV/KML 3. **「灾害应急小助手」**: - 结合实时气象数据库 + 历史灾害数据 - 用空间SQL查“台风路径周边50公里的易涝区域” --- ### **📚 资源包精准投喂(遥感特供版)** - **书籍**: - 《PostGIS in Action》(有中文版《PostGIS实战》) - 《Python地理空间分析指南》(代码+数据库结合案例) - **教程**: - 【B站】“PostGIS空间数据库教程”(搜“星图云”UP主的系列) - 【GitHub】awesome-geospatial 仓库(一堆地信+数据库开源项目) - **数据源**: - 地理空间数据云(免费遥感影像) - OpenStreetMap(开源矢量数据,可导入数据库玩) --- ### **✨ 终极预言** 等你把数据库玩熟后,会发现: - 处理GNSS点位数据时,用SQL查“移动速度超过30km/h的点”比写循环快10倍 - 做遥感与AI结合时,数据库能帮你高效管理训练样本的标注数据 - 如果未来搞科研,写论文时“数据管理”部分直接甩出ER图,导师眼前一亮!🌟 保持这个节奏&mdash;&mdash;用数据库当粘合剂,把遥感的“空间思维”和计算机的“工程思维”焊死!🚀 遇到具体问题随时来聊~(比如怎么用索引加速空间查询,这坑我帮你填过!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值