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