数据分析入门之pandas数据预处理

1、合并数据

导入数据:

import pandas as pd
from sqlalchemy import create_engine

engin = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8')
data = pd.read_sql('meal_order_detail1', con=engin)

在这里插入图片描述

1.1、横向表堆叠

  • 横向堆叠,即将两个表在X轴向拼接在一起,可以使用concat函数完成,concat函数的基本语法如下:
  • pandas.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
  • 常用参数如下所示:
参数名称 说明
objs 接收多个Series,DataFrame,Panel的组合。表示参与链接的pandas对象的列表的组合。无默认
axis 接收0或1。表示连接的轴向,默认为0
join 接收inner或outer。表示其他轴向上的索引是按交集(inner)还是并集(outer)进行合并。默认为outer
join_axes 接收Index对象。表示用于其他n-1条轴的索引,不执行并集/交集运算
ignore_index 接收boolean。表示是否不保留连接轴上的索引,产生一组新索引range(total_length)。默认为False
keys 接收sequence。表示与连接对象有关的值,用于形成连接轴向上的层次化索引。默认为None
levels 接收包含多个sequence的list。表示在指定keys参数后,指定用作层次化索引各级别上的索引。默认为None
names 接收list。表示在设置了keys和levels参数后,用于创建分层级别的名称。默认为None
verify_integrity 接收boolearn。表示是否检查结果对象新轴上的重复情况,如果发现则引发异常。默认为False
  • 当axis=1的时候,concat做行对齐,然后将不同列名称的两张或多张表合并。当两个表索引不完全一样时,可以使用join参数选择是内连接还是外连接。在内连接的情况下,仅仅返回索引重叠部分。在外连接的情况下,则显示索引的并集部分数据,不足的地方则使用空值填补。

在这里插入图片描述

  • 当两张表完全一样时,不论join参数取值是inner或者outer,结果都是将两个表完全按照X轴拼接起来。
a = data.iloc[:,:10]#所有行的前10列数据,按位置索引
b = data.iloc[:,10:]#所有行的10列后数据
pdcc = pd.concat([a,b], axis=1)#合并完成,axis=1表示横向,左右拼接
pdcc.shape

理解: data.iloc[:,:5] [纵 : 横],纵向全选,横向选5个截至。

在这里插入图片描述

1.2、纵向堆叠

1.2.1、concat函数

  • 使用concat函数时,在默认情况下,即axis=0时,concat做列对齐,将不同行索引的两张或多张表纵向合并。在两张表的列名并不完全相同的情况下,可join参数取值为inner时,返回的仅仅是列名交集所代表的列,取值为outer时,返回的是两者列名的并集所代表的列,其原理示意如图:
    在这里插入图片描述
  • 不论join参数取值是inner或者outer,结果都是将两个表完全按照Y轴拼接起来。
a = data.iloc[:100,:]
b = data.iloc[100:,:]
pd.concat([a,b]).shape#axis=0,默认可以不写
(2779, 19)

1.2.2、append方法

  • append方法也可以用于纵向合并两张表。但是append方法实现纵向表堆叠有一个前提条件,那就是两张表的列名需要完全一致
  • pandas.DataFrame.append(self, other, ignore_index=False, verify_integrity=False)
  • 常用参数如下所示:
参数名称 说明
other 接收DataFrame或Series。表示要添加的新数据。无默认
ignore_index 接收boolean。如果输入True,会对新生成的DataFrame使用新的索引(自动产生)而忽略原来数据的索引。默认为False
verify_integrity 接收boolean。如果输入True,那么当ignore_index为False时,会检查添加的数据索引是否冲突,如果冲突,则会添加失败。默认为False
a.append(b).shape
(2779, 19)

1.3、主键合并数据

(1) 导入数据

order = pd.read_csv('./meal_order_info.csv',encoding='gbk')
order.head()

在这里插入图片描述
(2) 查看数据类型
在这里插入图片描述
(3) 转换数据类型

order['info_id'] = order['info_id'].astype(str)

1.3.1、merge函数

pd.merge(order, data, left_on='info_id', right_on='order_id')

在这里插入图片描述

1.3.2、join方法

  • join方法也可以实现部分主键合并的功能,但是join方法使用时,两个主键的名字必须相同
  • pandas.DataFrame.join(self, other, on=None, how=‘left’, lsuffix=’’, rsuffix=’’, sort=False)
  • 常用参数说明如下:
参数名称 说明
other 接收DataFrame、Series或者包含了多个DataFrame的list。表示参与连接的其他DataFrame。无默认
on 接收列名或者包含列名的list或tuple。表示用于连接的列名。默认为None
how 接收特定string。inner代表内连接;outer代表外连接;left和right分别代表左连接和右连接。默认为inner
rsuffix 接收string。表示用于追加到右侧重叠列名的末尾。无默认
lsuffix 接收sring。表示用于追加到左侧重叠列名的末尾。无默认
sort 根据连接键对合并后的数据进行排序,默认为True

(1)更改order的主键名称

order.rename(columns={
   
   'info_id':'order_id'},inplace=True)

在这里插入图片描述
(2)按主键合并数据

data.join(order, on='order_id', rsuffix='1')

1.4、重叠合并数据

  • 数据分析和处理过程中若出现两份数据的内容几乎一致的情况,但是某些特征在其中一张表上是完整的,而在另外一张表上的数据则是缺失的时候,可以用combine_first方法进行重叠数据合并,其原理如下:
    在这里插入图片描述
    combine_first方法
  • combine_first的具体用法如下:
  • pandas.DataFrame.combine_first(other)
  • 参数及其说明如下:
参数名称 说明
other 接收DataFrame。表示参与重叠合并的另一个DataFrame。无默认

(1) 构造两个数组

import numpy as np

dis1 = {
   
   
    'id':list(range(1,10)),
    'cpu':['i7', 'i5', np.nan, 'i7', 'i7', 'i5', np.nan, np.nan,'i5']
}
a = pd.DataFrame(dis1)

dis2 = {
   
   
    'id':list(range(1,10)),
    'cpu':['i7', 'i5', 'i5', np.nan, 'i7', 'i5', 'i5', np.nan,'i5']
}
b = pd.DataFrame(dis2)

在这里插入图片描述
(2) 缺失值合并

a.combine_first(b)

在这里插入图片描述



2、清洗数据

2.1、检测与处理重复值

2.1.1、记录重复

  • 记录重复,即一个或者多个特征某几个记录的值完全相同
2.1.1.1、利用列表(list)去重
def delRep(list1):
    list2=[]
    for i in list1:
        if i not in list2:
            list2.append(i)
    return list2 
2.1.1.2、利用集合(set)的元素是唯一的特性去重
dish_set = set(dishes)

比较上述两种方法可以发现,方法一代码冗长。方法二代码简单了许多,但会导致数据的排列发生改变。

2.1.1.3、drop_duplicates去重方法
  • pandas提供了一个名为drop_duplicates的去重方法。该方法只对DataFrame或者Series类型有效。这种方法不会改变数据原始排列,并且兼具代码简洁和运行稳定的特点。该方法不仅支持单一特征的数据去重,还能够依据DataFrame的其中一个或者几个特征进行去重操作。
  • pandas.DataFrame(Series).drop_duplicates(self, subset=None, keep=‘first’, inplace=False)
参数名称 说明
subset 接收string或sequence。表示进行去重的列。默认为None,表示全部列
keep 接收特定string。表示重复时保留第几个数据。First:保留第一个。Last:保留最后一个。False:只要有重复都不保留。默认为first
inplace 接收boolean。表示是否在原表上进行操作。默认为False

(1) 查看数据

data['dishes_name']
0         蒜蓉生蚝
1        蒙古烤羊腿
2         大蒜苋菜
3        芝麻烤紫菜
4          蒜香包
         ...  
2774     白饭/大碗
2775       牛尾汤
2776    意文柠檬汁 
2777      金玉良缘
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值