在Python中是否有一个模块可以为R执行类似“sqldf”的操作?

时间:2011-12-24 22:33:59

标签: python sql r dataframe

列表理解非常好。但某种“......加入......”会非常有用。谢谢。 所以举个例子。我有一个集合A = {1,0},一个列表B = [[1,1],[2,3]]。我想找到B中的所有行,其中第二个colomu是A中的值之一。或者更常见的是,我有2个CSV文件。我想找出两个文件中某些冒号的值匹配的所有行。就像某种“加入”两个文件一样。其中一个文件是GB大小。 sqldf is "SQL select on R data frames."

4 个答案:

答案 0 :(得分:7)

您可以使用pandasql,它允许SQL样式查询pandas DataFrames。它与sqldf非常相似。

https://github.com/yhat/pandasql/

(完全免责声明,我写了)

编辑:博客文章记录了这里找到的一些功能: http://blog.yhathq.com/posts/pandasql-sql-for-pandas-dataframes.html

答案 1 :(得分:4)

我不知道某个库正在按照你的要求行事(但我只看了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]]
  

我有2个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]

答案 2 :(得分:1)

在开始使用sqldf的功能之前,您需要'df'的功能,即数据帧。 Python有一个可爱的版本:pandas:

http://pandas.sourceforge.net/

或许关于加入和合并的部分会有所帮助:

http://pandas.sourceforge.net/merging.html

我建议您先从小于您的千兆字节文件开始!

答案 3 :(得分:0)

现在有一个软件包可以执行此操作!检查以下链接:

pysqldf => https://pypi.org/project/pysqldf/

此软件包将允许您使用SQL查询熊猫数据框,就像sqldfR