pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
参数:
- sql:SQL命令字符串
- con:连接sql数据库的engine,一般可以用SQLalchemy或者pymysql之类的包建立
- index_col: 选择某一列作为index
- coerce_float:非常有用,将数字形式的字符串直接以float型读入
- parse_dates:将某一列日期型字符串转换为datetime型数据
- columns:要选取的列。
- chunksize:如果提供了一个整数值,那么就会返回一个generator,每次输出的行数就是提供的值的大小。
import pandas as pd
import pymysql
#用DBAPI构建数据库连接engi
con = pymysql.connect(host='******', port=3306, db='******',
user='******', password='******', charset='utf8')
sql = f'select * from report.bi_visit_ad_network_detail WHERE clue_id is not null and ' \
f'inquiry_id is not null and org_id=10667'
data = pd.read_sql(sql, con)
con.close()
pandas.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True)
参数:
- left/right - 两个不同的DataFrame对象;
- on - 用于连接的列索引名称,必须存在于左右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键(可多键连接,传多键列表给on);
- left_on - 左侧DataFrame中用作连接键的列名,这个参数在左右列名不相同,但代表的含义相同时非常有用;
- right_on - 右侧DataFrame中用作连接键的列名,可以是列名或长度等于DataFrame长度的数组;
- left_index - 使用左侧DataFrame中的行索引作为连接键(JOIN),默认为False;
- right_index - 使用右则DataFrame中的行索引做为连接键(JOIN),默认为False;
- how - 连接方式有left(左连), right(右连), outer(全连)以及inner(内连接),默认为inner;
- sort -默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能;
import pandas as pd
import pymysql
#用DBAPI构建数据库连接engience
con = pymysql.connect(host='******', port=3306, db='******',
user='******', password='******', charset='utf8')
left_sql = f"SELECT DATE(inquiry_create_time) as date,org_id,IF(manager_id in (0,-1,'') or " \
f"manager_id is null , -1 , manager_id) as manager_id, IF(manager_id IN (0,-1,'') OR " \
f"manager_id IS NULL, '公海', manager) AS manager from bi.base_inquiry_detail WHERE " \
f"org_id =10345 limit 10"
left = pd.read_sql(left_sql, con)
right_sql = f"SELECT id,DATE(mail_send_date) as date,user_id,org_id FROM bi.base_mail_send_detail" \
f" WHERE org_id = 10345 AND from_or_to_flag=1 and mail_success_flag =1 AND " \
f"mail_group_sending_single_show_flag=0 -- and DATE(mail_send_date) = '2020-06-01' " \
f"GROUP BY mail_box_id limit 10"
right = pd.read_sql(right_sql, con)
new_right = right.rename(columns={'user_id': 'manager_id'}) #给列重命名
new_left = left.apply(lambda x: x.astype('object')) #astype类型转换
results = pd.merge(new_left, new_right, on=['org_id', 'date', 'manager_id'], how='outer')
print(results)
con_bi.close()
下面两段代码效果一样:
new_right = right.rename(columns={'user_id': 'manager_id'}) #给列重命名
new_left = left.apply(lambda x: x.astype('object')) #astype类型转换
results = pd.merge(new_left, new_right, on=['org_id', 'date', 'manager_id'], how='outer')
new_left = left.apply(lambda x: x.astype('object')) #astype类型转换
results = pd.merge(new_left, right, left_on=['org_id', 'date', 'manager_id'],
right_on=['org_id', 'date', 'user_id'], how='outer')
1、重命名处理:
new_right = right.rename(columns={‘user_id’: ‘manager_id’}) #给列重命名
因为on参数要求两边列名相同
2、类型转:
new_left = left.apply(lambda x: x.astype(‘object’)) #astype类型转换
两边的org_id类型不一致:报如下错误