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 金玉良缘