网易首页 > 网易号 > 正文 申请入驻

PandaSQL:一个让你能够通过SQL语句进行pandas的操作的python包

0
分享至

  Pandas是近年来最好的数据操作库之一。它允许切片、分组、连接和执行任意数据转换。如果你熟练的使用SQL,那么这篇文章将介绍一种更直接、简单的使用Pandas处理大多数数据操作案例。

  假设你对SQL非常的熟悉,或者你想有更可读的代码。或者您只是想在dataframe上运行一个特殊的SQL查询。或者,也许你来自R,想要一个sqldf的替代品。

  这篇文章将介绍一种在pandas的dataframe中使用SQL的python包,并且使用一个不等链接的查询操作来介绍PandasSQL的使用方法。

  假设你必须连接两个dataframe。其中一个显示了我们对某些商品进行促销的时间段。第二个是事务Dataframe。我想知道促销活动推动的销售情况,也就是促销期间的销售情况。

  我们可以通过联接项目列以及联接条件(TransactionDt≥StartDt和TransactionDt≤EndDt)来实现这一点。因为现在我们的连接条件也有大于号和小于号,这样的连接称为不等连接。在继续之前,一定要考虑如何在pandas中做这样的事情。

  那么在pandas身上该怎么做呢?pandas肯定可以解决这个问题,尽管我认为它的可读性不够。

  让我们从生成一些要处理的随机数据开始。

  import pandas as pd
import random
import datetime
def random_dt_bw(start_date,end_date):
days_between = (end_date - start_date).days
random_num_days = random.randrange(days_between)
random_dt = start_date + datetime.timedelta(days=random_num_days)
return random_dt
def generate_data(n=1000):
items = [f"i_{x}" for x in range(n)]
start_dates = [random_dt_bw(datetime.date(2020,1,1),datetime.date(2020,9,1)) for x in range(n)]
end_dates = [x + datetime.timedelta(days=random.randint(1,10)) for x in start_dates]
offerDf = pd.DataFrame({"Item":items,
"StartDt":start_dates,
"EndDt":end_dates})
transaction_items = [f"i_{random.randint(0,n)}" for x in range(5*n)]
transaction_dt = [random_dt_bw(datetime.date(2020,1,1),datetime.date(2020,9,1)) for x in range(5*n)]
sales_amt = [random.randint(0,1000) for x in range(5*n)]
transactionDf = pd.DataFrame({"Item":transaction_items,"TransactionDt":transaction_dt,"Sales":sales_amt})
return offerDf,transactionDf

  您不需要担心上面的随机数据生成代码。只要知道我们的随机数据是什么样子就可以了:

  offerDf,transactionDf = generate_data(n=100000)

  一旦我们有了数据,我们就可以通过合并列项上的数据来进行不等连接,然后根据所需条件进行过滤。

  merged_df = pd.merge(offerDf,transactionDf,on='Item')pandas_solution = merged_df[(merged_df['TransactionDt']>=merged_df['StartDt']) &
(merged_df['TransactionDt']<=merged_df['EndDt'])]

  结果如下,正如我们所希望的:

  Pandas解决方案很好,可以做我们想做的事情,但是我们也可以使用PandaSQL以一种可读性更强的方式完成同样的事情。

  PandaSQL为我们提供了在panda数据数据库上编写SQL的方法。因此,如果您已经编写了一些SQL查询,那么使用pandaSQL可能比将它们转换为panda语法更有意义。为了开始使用PandaSQL,我们简单地安装它:

  pip install -U pandasql

  安装了pandaSQL之后,我们可以通过创建pysqldf函数来使用它,该函数接受一个查询作为输入,并运行该查询来返回一个Pandas DF。不用担心语法,因为跟使用pandas差不多。

  from pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())

  现在,我们可以使用这个函数在我们的pandas dataframe上运行任何SQL查询。下面是不等连接,我们希望使用可读性更强的SQL格式。

  q = """
SELECT A.*,B.TransactionDt,B.Sales
FROM
offerDf A
INNER JOIN
transactionDf B
ON
A.Item = B.Item AND
A.StartDt <= B.TransactionDt AND
A.EndDt >= B.TransactionDt;
"""
pandaSQL_solution = pysqldf(q)

  结果是一个我们所期望的panda Dataframe。索引已经自动为我们重置了,不像以前那样需要手动操作。

  虽然PandaSQL函数允许我们在我们的panda数据框架上运行SQL查询,并且在某些情况下是一个非常好的工具,但是它的性能不如纯panda语法。

  当我们用可读性更强的PandaSQL为pandas计时时,我们发现PandaSQL花费的时间大约是原生pandas的10倍。

  虽然PandaSQL库的性能不如本地的panda,但当我们想进行特别分析时,它是对我们的数据分析工具箱的一个很好的补充,而且对于那些更习惯使用SQL查询的人来说。

  想要更深入地了解这篇文章的代码,请访问我的GitHub知识库,在那里你可以找到这篇文章和我所有的文章的代码。

  github/MLWhiz/datascienceblogs/tree/master/pandasql

  译者注:我一直在寻找能够使用sql处理pandas的dataframe的解决方案,pandasSQL在这这方面起到了很好的开端,虽然它的性能还不足以在生产环境中使用,但是我们再进行EDA和数据分析等一次性的操作的时候完全可以使用sql替代复杂的pandas的查询语法。所以如果你跟我一样,对SQL非常熟悉,并且厌倦了pandas的复杂语法,pandasSQL是一个很好的解决方案

  作者:Rahul Agarwal

  deephub翻译组

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
10万块一台的机器人伴侣,卖疯了!

10万块一台的机器人伴侣,卖疯了!

呼呼历史论
2026-06-30 00:32:30
曝即将交易!你好,伦纳德!猛龙已经等了整整7年

曝即将交易!你好,伦纳德!猛龙已经等了整整7年

篮球实战宝典
2026-06-29 22:48:49
FIFA提议改点球规则被IFAB否决,世界杯淘汰赛仍抛两次硬币

FIFA提议改点球规则被IFAB否决,世界杯淘汰赛仍抛两次硬币

晚风知我意21
2026-06-30 00:10:51
一夜之间,80后集体叛逆染黄毛

一夜之间,80后集体叛逆染黄毛

超角度
2026-06-28 23:27:26
“我穿的还是长裤”,浙江一女主播还没走出小区门口,就遇到“攻击”…...身上现多处伤痕……

“我穿的还是长裤”,浙江一女主播还没走出小区门口,就遇到“攻击”…...身上现多处伤痕……

新浪财经
2026-06-29 10:42:06
今晚开始!央一央八爱奇艺等4部王炸剧来袭!众星云集,先追哪部

今晚开始!央一央八爱奇艺等4部王炸剧来袭!众星云集,先追哪部

小椰的奶奶
2026-06-30 01:19:29
雷军回应小米SU7 Ultra纽北成绩:造车之初就下决心 要造媲美保时捷特斯拉的梦想之车

雷军回应小米SU7 Ultra纽北成绩:造车之初就下决心 要造媲美保时捷特斯拉的梦想之车

快科技
2026-06-30 10:38:06
郑钦文公布后续参赛计划:已报名250雅典站 拒参加更低级别125赛

郑钦文公布后续参赛计划:已报名250雅典站 拒参加更低级别125赛

醉卧浮生
2026-06-30 07:49:11
“带父母旅游,落地第一天妈妈晒脱水进医院”热浪席卷欧洲,旅行变生存挑战

“带父母旅游,落地第一天妈妈晒脱水进医院”热浪席卷欧洲,旅行变生存挑战

上观新闻
2026-06-28 09:36:33
河北女子遭家暴驾车逃跑致丈夫身亡案二审维持原判,一审被判故意杀人罪获刑11年;女子父亲:会继续申诉一直打到底

河北女子遭家暴驾车逃跑致丈夫身亡案二审维持原判,一审被判故意杀人罪获刑11年;女子父亲:会继续申诉一直打到底

扬子晚报
2026-06-29 07:45:51
巴萨引援B计划曝光,凯恩成为焦点

巴萨引援B计划曝光,凯恩成为焦点

李絙在北漂
2026-06-30 10:00:08
经济学家道破阶层本质:努力赚钱是穷人的生存执念,理财投资是中产的进阶幻想,翻身靠这两个反直觉底层逻辑

经济学家道破阶层本质:努力赚钱是穷人的生存执念,理财投资是中产的进阶幻想,翻身靠这两个反直觉底层逻辑

心理观察局
2026-06-30 06:22:06
中纪委再标红线!公职人员下班后的饭局,这5种情况将严肃处理!

中纪委再标红线!公职人员下班后的饭局,这5种情况将严肃处理!

细说职场
2026-06-27 14:11:59
百吨王组团冲卡后续,交警拦不住,还遭死亡威胁,司机个个不简单

百吨王组团冲卡后续,交警拦不住,还遭死亡威胁,司机个个不简单

有范又有料
2026-06-29 19:23:44
Shams:老鹰拒绝执行库明加2430万美元的球队选项

Shams:老鹰拒绝执行库明加2430万美元的球队选项

懂球帝
2026-06-30 05:18:28
走个面、假慈善?被官方“点名”的韩红,如今用4000万让黑粉打脸

走个面、假慈善?被官方“点名”的韩红,如今用4000万让黑粉打脸

小椰的奶奶
2026-06-29 19:11:37
人伦大乱,正在悄悄毁掉无数中国家庭!看似普通,实则家道衰败

人伦大乱,正在悄悄毁掉无数中国家庭!看似普通,实则家道衰败

阿凯销售场
2026-06-29 18:09:39
一家6口5本美国护照,却还在国内“捞金”,年营收上百亿

一家6口5本美国护照,却还在国内“捞金”,年营收上百亿

混沌录
2026-06-19 16:14:07
乾隆皇帝一生到底临幸过多少女子?野史记载数字惊人,身体真不错

乾隆皇帝一生到底临幸过多少女子?野史记载数字惊人,身体真不错

王知鱼说历史
2026-06-29 07:16:34
油价大跌1.28元/升,92汽油大降三次后,下次7月3日调整

油价大跌1.28元/升,92汽油大降三次后,下次7月3日调整

猪友巴巴
2026-06-27 17:20:03
2026-06-30 11:08:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
2021文章数 1465关注度
往期回顾 全部

科技要闻

DeepSeek V4正式版要来 高峰期API价格翻倍

头条要闻

牛弹琴:韩国对男足耻辱出局激烈反应 全世界震惊不已

头条要闻

牛弹琴:韩国对男足耻辱出局激烈反应 全世界震惊不已

体育要闻

日本众将掩面痛哭 连续3届先破门却被逆转

娱乐要闻

韩红称要退出公益,多位名人挽留

财经要闻

韩国万亿"芯"基建:存储能否成AI时代油田

汽车要闻

谁懂啊家人们!爹味和班味一点都没,这台底盘最硬国产大猎装太上头!

态度原创

数码
旅游
健康
公开课
军事航空

数码要闻

售价3万的格力玫瑰空调被吐槽丑,朱磊回应称已卖出5万多台

旅游要闻

两个月六城文旅联动:南沙城市形象宣传跑出“出海”加速度

狂吃“糯叽叽”小心肠梗阻!

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

普京最新发声:俄罗斯正处于命运攸关之际

无障碍浏览 进入关怀版