sort_values vs order by和when when以及为什么我应该使用哪个

时间:2018-02-20 01:20:10

标签: sql pandas

这主要是在熊猫的jupyter笔记和查询范围内(我对两者都很新)。我注意到当我编写一个查询时,我需要以特定顺序执行数据帧:

if listA[0] in listB:
    k = listA[0]
else:
    k = listB[1]

我的朋友比我更有经验:

df = pd.read_sql("select date, count(*) as count from "+tableName+" group by date" ,conn").sort_values(['date'].ascending=False)

结果是一样的,但我无法得到关于为什么/何时使用排序 sort_values

的答案

2 个答案:

答案 0 :(得分:1)

我可以在这里想到几个原因:

  1. <强>性能
    调整运行SQL命令的代码需要花费很多很多小时。 SQL是 fast ,我愿意打赌用SQL引擎排序比用pandas更快。

  2. <强>可维护性
    例如,如果您确定明天不需要结果排序,那么您只需更改查询字符串而无需更改代码。如果您将查询传递给为您运行它的某个函数,这将特别有用。

  3. <强>美学
    作为一个具有良好设计感的程序员,第二种方法肯定会吸引你。将逻辑分成单独的部分绝对是糟糕设计的秘诀。

答案 1 :(得分:0)

就像你说的那样,两者都实现了相同的输出。区别在于 进行排序操作。在第一种情况下,sort_values()是一个pandas函数,它已链接到第一个read_sql()函数。这意味着您的Python引擎在之后执行排序,它从数据库连接中检索数据。这等同于:

df = pd.read_sql("select date, count(*) as count from "+tableName+" group by date" ,conn)  
df = df.sort_values(by='date', ascending=False) #sorting done in python environment, not by the database

第二种方法在数据库中执行排序,因此python环境不会对任何内容进行排序。这里的关键是要记住你基本上是在编写一个SQL语句并使用Python pandas运行它。

是否应该在数据库或运行python环境的计算机上承担排序负担。如果这是一个非常繁忙的生产数据库,您可能不想运行昂贵的排序操作,而只需使用pandas检索数据并在本地执行所有操作。或者,如果数据库是用于临时使用或非关键数据库,那么在这种情况下,只需对结果进行排序并在将数据加载到pandas之前是有意义的。

更新: 为了强化SQL引擎驱动(服务器端或数据库驱动)排序不一定总是最佳的概念,请阅读this article,其中包含一些有趣的性能分析统计信息以及何时加载db具有数据操作操作与何时“本地”操作。