IPython笔记本中针对CSV文件的SQL语句

6
我有一个名为tabledata.csv的文件,我一直在使用pandas.read_csv来读取或选择特定条件下的特定列。
例如,我使用以下代码选择所有"名称",其中session_id =1,这在datascientistworkbench上的IPython笔记本上运行良好。
             df = pandas.read_csv('/resources/data/findhelp/tabledata.csv')
             df['name'][df['session_id']==1]

我在阅读CSV文件后,想知道是否有可能将其视为SQL数据库进行"切换/读取"。(我很确定我没有用正确的术语解释清楚,对此我感到抱歉!) 但是我的意思是,我想在IPython笔记本上使用SQL语句选择特定条件的特定行。就像我可以使用类似以下语句:

Select `name`, count(distinct `session_id`) from tabledata where `session_id` like "100.1%" group by `session_id` order by `session_id`

但我想我需要找到一种方法将csv文件转换为另一种格式,这样我才能使用SQL语句。非常感谢!


你可能想要查看Blaze,它提供了一个通用接口(不是SQL)来查询和处理存储在不同格式中的数据,或者查看Odo,它可以轻松地在不同格式之间移动数据(例如,它可以将csv加载到SQL数据库中)。 - Thomas K
这是一篇很好的介绍,说明了pandas如何与SQL相比较:http://pandas.pydata.org/pandas-docs/version/0.18.0/comparison_with_sql.html。同时,您能... - measureallthethings
另外,您能否提供一个 df.head() 或您正在处理的数据示例? - measureallthethings
@measureallthethings 谢谢!这些比较非常有用! - yingnan liu
2个回答

11

这是有关pandas和SQL的快速入门,使用内置的sqlite3包。一般来说,您可以以某种方式在pandas中执行所有SQL操作。但是数据库当然很有用。您需要做的第一件事是将原始df存储在sql数据库中,以便您可以进行查询。步骤如下。

import pandas as pd
import sqlite3

#read the CSV
df = pd.read_csv('/resources/data/findhelp/tabledata.csv')
#connect to a database
conn = sqlite3.connect("Any_Database_Name.db") #if the db does not exist, this creates a Any_Database_Name.db file in the current directory
#store your table in the database:
df.to_sql('Some_Table_Name', conn)
#read a SQL Query out of your database and into a pandas dataframe
sql_string = 'SELECT * FROM Some_Table_Name'
df = pd.read_sql(sql_string, conn)

谢谢!!!我正在测试你的代码,但是出现了一个错误:“'utf-8'编解码器无法解码第27个位置的0x89字节:无效的起始字节”。你能帮我解决一下吗?谢谢!! - yingnan liu
这段代码是在读取CSV文件(df=pd.read_csv.....)时出现了问题,尽管已经添加了ecoding='utf8',但仍然无法正常工作并显示相同的错误。可能是CSV文件本身存在问题导致的。谢谢! - yingnan liu
基本上你只需要尝试几种不同的编码方式。例如,尝试:df = pd.read_csv('filname.csv', encoding="ISO-8859-1")。我认为这与你的 CSV 中有特殊字符有关。你知道 CSV 应该使用什么编码吗? - Sam
说实话,我不知道这个 CSV 文件使用的是什么编码方式,我只是在我的 Mac 上将它保存为 CSV 文件。这会有影响吗? - yingnan liu
如果你有像ñòóôõö这样的特殊字符,那就很重要了。但基本上,大多数人做法都是尝试不同的解码器,直到它能正常工作。很高兴能帮到你! - Sam
显示剩余2条评论

0
另一个答案建议使用SQLite。然而,DuckDB是一个比将数据加载到SQLite更快的替代方案。
首先,加载数据需要时间;其次,SQLite并不针对分析查询(例如聚合)进行优化。
以下是一个在Jupyter笔记本中可以运行的完整示例:
安装
pip install jupysql duckdb duckdb-engine

注意:如果您想在笔记本中运行此程序,请使用%pip install jupysql duckdb duckdb-engine

示例

加载扩展(%sql魔法)并创建内存数据库:

%load_ext SQL
%sql duckdb://

下载一些示例CSV数据:

from urllib.request import urlretrieve

urlretrieve("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv", "penguins.csv")

查询:

%%sql
SELECT species, COUNT(*) AS count
FROM penguins.csv
GROUP BY species
ORDER BY count DESC

JupySQL文档在此处可用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接