使用Pandas进行数据预处理 笔记1 任务5.1 合并数据

使用pandas进行数据预处理

任务5.1 合并数据

import numpy as np
import pandas as pd
from sqlalchemy import create_engine
%%html
<img src='./image/5-1.png', width=700, height=400>

在这里插入图片描述

%%html
<img src='./image/5-2.png', width=700, height=400>

在这里插入图片描述

%%html
<img src='./image/5-3.png', width=700, height=400>

在这里插入图片描述

代码5-1 索引完全相同时的横向堆叠

conn = create_engine('mysql+pymysql://root:123456@localhost:3306/zuoye')
detail1 = pd.read_sql('meal_order_detail1',conn)
df1 = detail1.iloc[:,:10] ##取出detail1的前10列数据
df2 = detail1.iloc[:,10:] ##取出detail1的后9列数据
print('合并df1的大小为%s,df2的大小为%s。'%(df1.shape,df2.shape))
print('外连接合并后的数据框大小为:',pd.concat([df1,df2],
        axis=1,join='inner').shape)
print('内连接合并后的数据框大小为:',pd.concat([df1,df2],
        axis=1,join='outer').shape)
D:\Study\anaconda\lib\site-packages\pymysql\cursors.py:170: Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 1")
  result = self._query(query)


合并df1的大小为(2779, 10),df2的大小为(2779, 9)。
外连接合并后的数据框大小为: (2779, 19)
内连接合并后的数据框大小为: (2779, 19)

5-2 表名完全相同时的concat纵向堆叠

# 代码 5-2
df3 = detail1.iloc[:1500,:] ##取出detail1前1500行数据
df4 = detail1.iloc[1500:,:] ##取出detail1的1500后的数据
print('合并df3的大小为%s,df4的大小为%s。'%(df3.shape,df4.shape))
print('内连接纵向合并后的数据框大小为:',pd.concat([df3,df4],
        axis=1,join='inner').shape)
print('外连接纵向合并后的数据框大小为:',pd.concat([df3,df4],
        axis=1,join='outer').shape)
合并df3的大小为(1500, 19),df4的大小为(1279, 19)。
内连接纵向合并后的数据框大小为: (0, 38)
外连接纵向合并后的数据框大小为: (2779, 38)

5-3 使用append方法的参数及其说明

print('堆叠前df3的大小为%s,df4的大小为%s。'%(df3.shape,df4.shape))
print('append纵向堆叠后的数据框大小为:',df3.append(df4).shape)
堆叠前df3的大小为(1500, 19),df4的大小为(1279, 19)。
append纵向堆叠后的数据框大小为: (2779, 19)

5.1.2 主键合并数据

%%html
<img src='./image/5-6.png', width=700, height=400>

<img src='./image/5-6.png', width=700, height=400>

%%html
<img src='./image/5-4.png', width=700, height=400>

在这里插入图片描述

%%html
<img src='./image/5-5.png', width=700, height=400>

在这里插入图片描述

5-4 使用merge函数合并数据表

order = pd.read_csv('../data/meal_order_info.csv',
        sep=',',encoding='gb18030') ##读取订单信息表
##info_id转换为字符串格式,为合并做准备
order['info_id'] = order['info_id'].astype('str') 
## 订单详情表和订单信息表都有订单编号
##在订单详情表中为order_id,在订单信息表中为info_id
order_detail = pd.merge(detail1,order,
        left_on='order_id',right_on = 'info_id')
print('detail1订单详情表的原始形状为:',detail1.shape)
print('order订单信息表的原始形状为:',order.shape)
print('订单详情表和订单信息表主键合并后的形状为:',order_detail.shape)
detail1订单详情表的原始形状为: (2779, 19)
order订单信息表的原始形状为: (945, 21)
订单详情表和订单信息表主键合并后的形状为: (2779, 40)
%%html
<img src='./image/5-7.png', width=700, height=400>

在这里插入图片描述

5-5 使用join方法实现主键合并

# # order.rename({'info_id':'order_id'},inplace=True)
# order_detail1 = detail1.join(order,on='order_id',rsuffix='1')
# print('订单详情表和订单信息表join合并后的形状为:',order_detail1.shape)

5.1.3 重叠合并数据

%%html
<img src='./image/5-8.png', width=700, height=400>

在这里插入图片描述

%%html
<img src='./image/5-9.png', width=700, height=400>

在这里插入图片描述

5-6 重叠合并

dict1 = {'ID':[1,2,3,4,5,6,7,8,9],
         'System':['win10','win10',np.nan,'win10',
                np.nan,np.nan,'win7','win7','win8'],
      'cpu':['i7','i5',np.nan,'i7',np.nan,np.nan,'i5','i5','i3']}

dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
         'System':[np.nan,np.nan,'win7',np.nan,
                'win8','win7',np.nan,np.nan,np.nan],
        'cpu':[np.nan,np.nan,'i3',np.nan,'i7',
                'i5',np.nan,np.nan,np.nan]}

## 转换两个字典为DataFrame
df5 = pd.DataFrame(dict1)
df6 = pd.DataFrame(dict2)
print('经过重叠合并后的数据为:\n',df5.combine_first(df6))
经过重叠合并后的数据为:
    ID System cpu
0   1  win10  i7
1   2  win10  i5
2   3   win7  i3
3   4  win10  i7
4   5   win8  i7
5   6   win7  i5
6   7   win7  i5
7   8   win7  i5
8   9   win8  i3

5-7 将多张菜品订单详情表纵向合并

1.堆叠不同时间的订单详情表

订单详情表meal_order_detail1、meal_order_detail2、meal_order_detail3具有相同的特征,但数据时间不同,订单编号也不同,在数据分析过程中需要使用全量数据,故需要将几张表做纵向堆叠操作

## 读取数据
detail1 = pd.read_sql('meal_order_detail1',conn)
detail2 = pd.read_sql('meal_order_detail2',conn)
detail3 = pd.read_sql('meal_order_detail3',conn)
## 纵向堆叠三张表
detail = detail1.append(detail2)
detail = detail.append(detail3)
print('三张订单详情表合并后的形状为:', detail.shape)
三张订单详情表合并后的形状为: (10037, 19)

5-8 订单详情表,订单信息表,客户信息表主键合并

订单详情表、订单信息表和客户信息表两两之间存在相同意义的字段,因此需通过主键合并的方式将三张表合并为一张宽表。

order = pd.read_csv('../data/meal_order_info.csv',
        sep=',',encoding='gb18030') ##读取订单信息表
user = pd.read_excel('../data/users_info.xlsx') ##读取用户信息表
## 数据类型转换,存储部分数据
order['info_id'] = order['info_id'].astype('str')
order['emp_id'] = order['emp_id'].astype('str')
user['USER_ID'] = user['USER_ID'].astype('str')
data = pd.merge(detail,order,left_on = ['order_id','emp_id'],
               right_on = ['info_id','emp_id'])
data = pd.merge(data,user,left_on='emp_id',
        right_on = 'USER_ID',how = 'inner')
print('三张表数据主键合并后的大小为:',data.shape)
三张表数据主键合并后的大小为: (14713, 76)

在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据闲逛人

谢谢大嘎喔~ 开心就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值