游龙战神|PandaSQL:通过SQL语句进行pandas的操作的包

Pandas是近年来最好的数据操作库之一 。 它允许切片、分组、连接和执行任意数据转换 。 如果你熟练的使用SQL,那么这篇文章将介绍一种更直接、简单的使用Pandas处理大多数数据操作案例 。
游龙战神|PandaSQL:通过SQL语句进行pandas的操作的包假设你对SQL非常的熟悉 , 或者你想有更可读的代码 。 或者您只是想在dataframe上运行一个特殊的SQL查询 。 或者 , 也许你来自R , 想要一个sqldf的替代品 。
这篇文章将介绍一种在pandas的dataframe中使用SQL的python包 , 并且使用一个不等链接的查询操作来介绍PandasSQL的使用方法 。
不等连接(Non-equi join)假设你必须连接两个dataframe 。 其中一个显示了我们对某些商品进行促销的时间段 。 第二个是事务Dataframe 。 我想知道促销活动推动的销售情况 , 也就是促销期间的销售情况 。
我们可以通过联接项目列以及联接条件(TransactionDt≥StartDt和TransactionDt≤EndDt)来实现这一点 。 因为现在我们的连接条件也有大于号和小于号 , 这样的连接称为不等连接 。 在继续之前 , 一定要考虑如何在pandas中做这样的事情 。
游龙战神|PandaSQL:通过SQL语句进行pandas的操作的包pandas的解决方案那么在pandas身上该怎么做呢?pandas肯定可以解决这个问题 , 尽管我认为它的可读性不够 。
让我们从生成一些要处理的随机数据开始 。
import pandas as pdimport randomimport datetimedef random_dt_bw(start_date,end_date):days_between = (end_date - start_date).daysrandom_num_days = random.randrange(days_between)random_dt = start_date + datetime.timedelta(days=random_num_days)return random_dtdef 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)
游龙战神|PandaSQL:通过SQL语句进行pandas的操作的包
游龙战神|PandaSQL:通过SQL语句进行pandas的操作的包一旦我们有了数据 , 我们就可以通过合并列项上的数据来进行不等连接 , 然后根据所需条件进行过滤 。
merged_df = pd.merge(offerDf,transactionDf,on='Item')pandas_solution = merged_df[(merged_df['TransactionDt']>=merged_df['StartDt'])"""pandaSQL_solution = pysqldf(q)结果是一个我们所期望的panda Dataframe 。 索引已经自动为我们重置了 , 不像以前那样需要手动操作 。


推荐阅读