Python中有没有类似R中“sqldf”的模块?
列表推导式非常好用。但是有一种“...连接...”的功能会更有用。谢谢。
举个例子,我有一个集合 A = {1,0},还有一个列表 B = [[1,1],[2,3]]。我想找出 B 中所有第二列的值是 A 中某个值的行。或者说得更广泛一点,我有两个 CSV 文件。我想找出这两个文件中某一列的值相同的所有行。就像是把两个文件“连接”起来一样。其中一个文件的大小是 GB 级别的。
sqldf 是 "在 R 数据框上进行 SQL 查询."
4 个回答
在使用sqldf的功能之前,你需要先了解'df'的功能,也就是数据框(dataframes)。Python有一个很友好的版本:pandas。
http://pandas.sourceforge.net/
也许关于连接和合并的部分会对你有帮助:
http://pandas.sourceforge.net/merging.html
不过,我建议你先从比你那几GB的大文件小一些的文件开始练习!
我不知道有没有库可以做到你想要的功能(不过我只是简单看了一下sqldf
的文档),但其实你问的这些内容并不一定需要用到库,直接用Python的一行代码就能搞定(当然,你也可以把这些功能封装成一个函数,而不是简单的列表推导式……)
假设有一个集合A = {1,0},还有一个列表B = [[1,1],[2,3]]。我想找出B中所有第二列的值是A中某个值的行。
>>> a = set([1, 0])
>>> b = [[1,1],[2,3]]
>>> [l for l in b if l[1] in a]
[[1, 1]]
我有两个CSV文件。我想找出这两个文件中某一列的值相同的所有行。
>>> f1 = [[1, 2, 3], [4, 5, 6]]
>>> f2 = [[0, 2, 8], [7, 7, 7]]
>>> [tuple_ for tuple_ in zip(f1, f2) if tuple_[0][1] == tuple_[1][1]]
[([1, 2, 3], [0, 2, 8])]
补充:如果内存使用是个问题,你应该使用生成器而不是列表。例如:
>>> zip(f1, f2)
[([1, 2, 3], [0, 2, 8]), ([4, 5, 6], [7, 7, 7])]
使用生成器:
>>> import itertools as it
>>> gen = it.izip(f1, f2)
>>> gen
<itertools.izip object at 0x1f24ab8>
>>> next(gen)
([1, 2, 3], [0, 2, 8])
>>> next(gen)
([4, 5, 6], [7, 7, 7])
还有数据源:
>>> [line for line in f1]
[[1, 2, 3], [4, 5, 6]]
将翻译作为生成器:
>>> gen = (line for line in f1)
>>> gen
<generator object <genexpr> at 0x1f159b0>
>>> next(gen)
[1, 2, 3]
>>> next(gen)
[4, 5, 6]
你可以使用pandasql,它可以让你用SQL的方式来查询pandas的数据表(DataFrame)。这和sqldf非常相似。
https://github.com/yhat/pandasql/
(特别说明,我是这个工具的作者)
补充:这里有一篇博客文章,介绍了一些pandasql的功能: http://blog.yhathq.com/posts/pandasql-sql-for-pandas-dataframes.html