【发布时间】:2014-09-15 07:12:02
【问题描述】:
我正在将 python 中的 SQL 查询转换为 pandas 数据框。然后我使用 pandas sql 在两个 pandas 数据框之间进行左外连接。 我的代码是:
import MySQLdb as mdb
from pandasql import sqldf
from collections import OrderedDict
from pandas import DataFrame
import pandas as pd
top_name_gender = [['Nicole','female'],['Jerson','male'],['Kim','female']]
gender = OrderedDict()
gender['first_name'] = []
gender['gender'] = []
for row in top_name_gender:
gender['first_name'].append(row[0])
gender['gender'].append(row[1])
gender_df = DataFrame(gender)
customer = OrderedDict()
customer['email'] = []
customer['first_name'] = []
customer['gender'] = []
query_customer = """SELECT
email,
lower(substring_index(first_name,' ',1)) as first_name,
gender
FROM bob_live.customer
limit 10000000000"""
con = mdb.connect(host='db03.phlan', port=3306, user='crm', passwd='.....', db='bob_live')
cur = con.cursor()
cur.execute(query_customer)
for row in cur.fetchall():
customer['email'].append(row[0])
customer['first_name'].append(row[1])
customer['gender'].append(row[2])
customer_df = DataFrame(customer)
query1 = """"
select customer_df.*, gender_df.*
from customer_df
left outter join gender_df
on customer_df.first_name = gender_df.first_name"""
joined = sqldf(query1,locals())
joined.text_factory = str
但我有以下错误:
sqlite3.ProgrammingError: 你不能使用 8 位字节串,除非 您使用可以解释 8 位字节串的 text_factory(例如 text_factory = str)。强烈建议您改为 将您的应用程序切换到 Unicode 字符串
我尝试添加
con.text_factory = str
cur.text_factory = str
但它不会改变任何东西。
有什么建议吗?
【问题讨论】:
-
您是否粘贴了您拥有的确切代码?在这种情况下,这里有奇数符号 '"':
query1 = """" -
试试这个:
joined.text_factory = unicode或者这个:query1 = u"""... -
感谢@stalk 的评论,我都试过了,但都不起作用
-
您从 sql 数据库中读取它的事实在这里并不重要(顺便说一句,如果您为此使用
pd.read_sql_query会更容易),因此您可以忽略它。您能否也给出一个可重现的customer_df示例,它给出了错误? -
嗨 @joris 感谢您的回答和建议(我现在正在使用 read_sql_query),那么 customer_df 没有给我任何错误
标签: python sql encoding pandas