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: 选择某一列作为indexcoerce_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类型不一致:报如下错误