在pandas数据集上执行SQL查询

Mig*_*tos 22 python sqlite pandas

我有一个叫做'df'的熊猫数据集.

我怎么能做下面这样的事情;

df.query("select * from df")
Run Code Online (Sandbox Code Playgroud)

谢谢.

对于那些了解R的人来说,有一个名为sqldf的库,你可以在R中执行SQL代码,我的问题基本上就是,在python中有一些像sqldf这样的库

WeN*_*Ben 50

这不pandas.query应该做,你可以看看包pandasql(同样sqldf在R中)

import pandas as pd
import pandasql as ps

df = pd.DataFrame([[1234, 'Customer A', '123 Street', np.nan],
               [1234, 'Customer A', np.nan, '333 Street'],
               [1233, 'Customer B', '444 Street', '333 Street'],
              [1233, 'Customer B', '444 Street', '666 Street']], columns=
['ID', 'Customer', 'Billing Address', 'Shipping Address'])

q1 = """SELECT ID FROM df """

print(ps.sqldf(q1, locals()))

     ID
0  1234
1  1234
2  1233
3  1233
Run Code Online (Sandbox Code Playgroud)


Leo*_*Liu 36

更好的解决方案是使用 duckdb。它比 sqldf 快得多,因为它不必将整个数据加载到 sqlite 中并加载回 pandas。

pip install duckdb
Run Code Online (Sandbox Code Playgroud)
pip install duckdb
Run Code Online (Sandbox Code Playgroud)

相对 pandasql 的性能改进:测试数据 NYC 黄色出租车 ~120mb 的 csv 数据

import pandas as pd
import duckdb
test_df = pd.DataFrame.from_dict({"i":[1, 2, 3, 4], "j":["one", "two", "three", "four"]})

duckdb.query("SELECT * FROM test_df where i>2").df() # returns a result dataframe
Run Code Online (Sandbox Code Playgroud)
nyc = pd.read_csv('https://s3.amazonaws.com/nyc-tlc/trip+data/yellow_tripdata_2021-01.csv',low_memory=False)
Run Code Online (Sandbox Code Playgroud)
from pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())
Run Code Online (Sandbox Code Playgroud)
pysqldf("SELECT * FROM nyc where trip_distance>10")
# wall time 16.1s
Run Code Online (Sandbox Code Playgroud)

速度提高约 100 倍

本文提供了很好的细节,并声称比 pandasql 提高了 1000 倍: https://duckdb.org/2021/05/14/sql-on-pandas.html

  • 这应该是公认的解决方案。 (2认同)

Mig*_*tos 14

使用一段时间后,我意识到最简单的方法就是这样做

from pandasql import sqldf

output = sqldf("select * from df")
Run Code Online (Sandbox Code Playgroud)

df熊猫数据框的魅力一样工作您可以安装pandasql:https ://pypi.org/project/pandasql/


use*_*828 5

您可以使用DataFrame.query(condition)返回数据框匹配的子集,condition如下所示:

df = pd.DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'))
df
   A  B  C
0  0  1  2
1  3  4  5
2  6  7  8

df.query('C < 6')
   A  B  C
0  0  1  2
1  3  4  5


df.query('2*B <= C')
   A  B  C
0  0  1  2


df.query('A % 2 == 0')
   A  B  C
0  0  1  2
2  6  7  8
Run Code Online (Sandbox Code Playgroud)

除了隐含的之外,这与 SQL 语句的效果基本相同SELECT * FROM df WHERE


Zac*_*ler 5

实际上我刚刚发布了一个新包,名为 dataframe_sql。这使您能够按照您的意愿使用 SQL 查询 pandas 数据帧。您可以在这里找到该包