简单的pandasql连接失败

时间:2015-01-29 18:19:39

标签: python pandas pandasql

我试图理解为什么以下pandasql失败了:

import pandas as pd
import pandasql as pdsql
def pysql(q): return pdsql.sqldf(q, globals())

type_table = {
    "type_id" : [101, 102],
    "type_name" : ["Go", "Stop"]
}

types = pd.DataFrame(type_table)
print 'Table "types":'
print types

events = pd.DataFrame(
{
    "type" : [101, 101, 102, 101, 102, 102],
    "time" : [1, 2, 3, 4, 5, 6],
    "success" : [0, 0, 1, 1, 1, 1]
})
print '\nTable "events":'
print events

query = """SELECT t.type_name, count(e.success) as event_count 
FROM types AS t, events AS e
WHERE t.type_id = e.type
GROUP BY t.type_name;
"""
print "\nQuery:"
print query
print "Result:"
print pysql(query)

这会返回None,但我希望它返回类似

的内容
  type_name  event_count
0   Go              3
1   Stop            3

我不理解的SQLite联接是否存在限制,这是pandasql的问题?我在Access中尝试过这个例子并且它在那里工作得很好,但也许有一种更便携的方法可以用SQL(很可能)或者只是使用pandas的简单方法吗?

嗯 - 即使是更简单的连接

SELECT types.type_name, events.time                                                                                     
FROM types, events                                                                                                      
WHERE types.type_id = events.type

失败。绝对困惑。


编辑: 鉴于@ ari的建议,我用我的真实数据(几百万行)尝试了这一点,并发现对于我的实际例子来说,它的速度要快得多

events[events.success == 0].replace(name_map).groupby('type').size()

而非

events.replace(name_map).groupby('type').success.size()

其中name_map是从上面的types表创建的地图。

两者都比SQL查询更快,所以我应该只是对此进行讨论,但我仍然想知道为什么它不起作用。

1 个答案:

答案 0 :(得分:0)

如果您包含JOIN声明,则可以使用

query = """SELECT t.type_name, count(e.success) as event_count 
FROM types t JOIN events e ON t.type_id = e.type
GROUP BY t.type_name
"""