【问题标题】:Is there a module in Python that does something like "sqldf" for R?Python中是否有一个模块可以为R执行类似“sqldf”的操作?
【发布时间】:2012-01-27 11:21:00
【问题描述】:

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

【问题讨论】:

  • 如果您对sqldf 为非 R 用户所做的事情有一个简短的总结,您会得到更多/更好的答案。您究竟想要它的哪些部分功能?
  • 同意...此外,一些代码或至少一些伪代码来解释您正在尝试做什么会有所帮助。

标签: python sql r dataframe


【解决方案1】:

我不知道有一个库在做你要求的事情(但我只看了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]

【讨论】:

  • 谢谢@mac。你是对的,如果你不处理一次无法在内存中读取的大文件,列表理解与 SQL 一样强大。如果我对大 CSV 文件也这样做,我会非常高兴。
  • @gstar2002 - 没有什么可以阻止您将此语法用于生成器而不是列表。查看修改。
  • 谢谢,它适用于 izip。但是对于 ([l1,l2] for l1 in f1 for l2 in f2) 之类的东西,它不起作用。我只得到 f1 的第一行与 f2 的所有行相结合。但我想拥有所有组合。
  • @gstar2002 - 你的问题的答案是it.product(f1, f2)... 但是你真的应该阅读文档,尝试一些东西并学习 Python。 :) SO 不是一个“教我”的网站,它是一个“我被困住了,我不知道去哪里寻找解决方案”的网站。您已经得到了答案:查看生成器和 itertools 库,现在研究它们,尝试所有不同的功能,进行实验...查看示例代码...如果/当您在尝试了所有这些后遇到问题时您可以想到,发布一个新问题,我们会在这里为您服务! :)
【解决方案2】:

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

http://pandas.sourceforge.net/

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    编辑:博客文章记录了此处发现的一些功能: http://blog.yhathq.com/posts/pandasql-sql-for-pandas-dataframes.html

    【讨论】:

      【解决方案4】:

      现在有一个包可以做到这一点!检查以下链接:

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

      这个包将允许您使用 SQL 查询 pandas 数据框,就像 R 中的 sqldfdid 一样

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2014-02-11
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多