文章目录
使用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>
%%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)