这主要是在熊猫的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
的答案答案 0 :(得分:1)
我可以在这里想到几个原因:
<强>性能强>
调整运行SQL命令的代码需要花费很多很多小时。 SQL是 fast ,我愿意打赌用SQL引擎排序比用pandas更快。
<强>可维护性强>
例如,如果您确定明天不需要结果排序,那么您只需更改查询字符串而无需更改代码。如果您将查询传递给为您运行它的某个函数,这将特别有用。
<强>美学强>
作为一个具有良好设计感的程序员,第二种方法肯定会吸引你。将逻辑分成单独的部分绝对是糟糕设计的秘诀。
答案 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具有数据操作操作与何时“本地”操作。