我试图理解为什么以下失败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 查询快得多,所以我可能应该强调一下,但我仍然想知道它为什么不起作用。