pandas之merge

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类型不一致:报如下错误
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值