您的当前位置:首页正文

pandas--数据预处理

2024-11-27 来源:个人技术集锦

合并数据

堆叠合并数据

横向堆叠

  • 将两个表在x轴向拼接在一起。语法:pandas.concat(objs,axis=0,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。表示其他轴向上的索引是按交集还是并集进行合并。默认为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 接收boolean。检查新连接的轴是否包含重复项。如果发现重复项,则引发异常。默认为False

在内连接的情况下,仅仅返回索引重叠部分;在外连接的情况下,则显示索引的并集部分数据,不足的地方使用空值填补。

  • 索引完全相同时的横向堆叠
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
conn = create_engine('mysql+pymysql://root:1234@\
127.0.0.1:3306/testdb?charset=utf8')
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)
合并df1的大小为(2779, 10),df2的大小为(2779, 9)。
外连接合并后的数据框大小为: (2779, 19)
内连接合并后的数据框大小为: (2779, 19)

纵向堆叠

  • 将两个数据表在y轴向上拼接。
参数名称 说明
other 接收DataFrame或Series。表示要添加的新数据。无默认
ignore_index 接收boolean。如果输入True,就会对新生成的DataFrame使用新的索引(自动产生),默认为False
verify_integrity 接收boolean。如果输入True,那么当ignore_index为False时,会检查添加的数据索引是否冲突,如果冲突,则会添加失败。默认为False
  • 表名完全相同时的concat纵向堆叠
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)
  • 使用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)

主键合并数据

  • 通过一个或多个键将两个数据集的行连接起来
  1. merge函数:可以左连接、内连接、外连接语法:pandas.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=('_x','_y'),copy=True,indicator=False)
  2. join方法:两个主键的名字必需相同。语法:pandas.DataFrame.join(self,other,on=None,how='left',lsuffix='',rsuffix='',sort=False)

merge函数的参数及其说明

参数名称 说明
left 接收DataFrame或Series。表示要添加的新数据1。无默认
right 接收DataFrame或Series。表示要添加的新数据2。无默认
how 接收inner、outer、left、right。表示数据的连接方式。默认为inner
on 接收string或sequence。表示两个数据合并的主键(必须一致)。默认为None
left_on 接收string或sequence。表示left参数接收数据用于合并的主键。默认为None
right_on 接收string或sequence。表示right参数接收数据用于合并的主键。默认为None
sort 接收boolean。表示是否根据连接键对合并后的数据进行排序。默认为False
suffixes 接收tuple。表示用于追加到left和right参数接收数据列名相同时的后缀。默认为(‘_x’,‘_y’)

join方法的参数及其说明

参数名称 说明
other 接收DataFrame、Series或者包含了多个DataFrame的list。表示参与李连杰的其他DataFrame。无默认
on 接收列名或者包含列名的list或tuple。表示用于连接的列名。默认为None
how 接收特定string。取值为”inner“时代表内连接;取值为”outer“时代表外连接;取值为”left“时代表左连接;取值为”right“时代表右连接。默认为”inner“
lsuffix 接收string。表示用于追加到左侧重叠列名的尾缀。无默认
rsuffix 接收string。表示用于追加到右侧重叠列名的尾缀。无默认
sort 接收boolean。根据连接键对合并后的数据进行排序,默认为False
  • 使用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)
  • 使用join方法实现主键合并
order.rename({
   'info_id':'order_id'},inplace=True)
order_detail1 = detail1.join(order,on='order_id',rsuffix='1')
print('订单详情表和订单信息表join合并后的形状为:',order_detail1.shape)
订单详情表和订单信息表join合并后的形状为: (2779, 40)

重复合并数据

  • 当两张数据表内容基本一致,但是各有些缺失时,可以采用combine_first进行重叠数据合并。语法:pandas.DataFrame.combine_first(other)

combine_first方法的参数及其说明

参数名称 说明
other 接收DataFrame。表示参与重叠合并的另一个DataFrame。无默认
  • 重叠合并
#建立两个字典,除了ID外,别的特征互补
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.
显示全文