pandas进行数据预处理

合并数据

堆叠合并数据

堆叠就是简单地把两个表拼在一起,也被称作轴向连接、绑定或连接。依照连接轴的方向,数据堆叠可分为横向堆叠和纵向堆叠。

横向堆叠

横向堆叠,即将两个表在x轴向拼接在一起,可以使用concat函数完成。当concat参数axis=1时,concat做行对齐,然后将然后将不同列名称的两张或多张表合并。当两个表索引不完全一样时,可以使用join参数选择是内连接还是外连接。在内连接的情况下,仅仅返回索引重叠部分。在外连接的情况下,则显示索引的并集部分数据,不足的地方则使用空值填补。其原理实例如下图。
在这里插入图片描述
当两张表完全一样时,不论join参数取值是inner或者outer,结果都是将两个表完全按照X轴拼接起来。

conn = create_engine('mysql+pymysql://root:@localhost:3306/testdb')//连接数据库
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)

纵向堆叠

对比横向堆叠,纵向堆叠是将两个数据表在y轴向上拼接。concat函数和append函数方法两者都可以实现纵向堆叠。

  • concat函数
    使用concat函数时,在默认情况下,即axis=0时,concat做列对齐,将不同行索引的两张或多张表纵向合并。在两张表的列名并不完全相同的情况下,可join参数取值为inner时,返回的仅仅是列名交集所代表的列,取值为outer时,返回的是两者列名的并集所代表的列,其原理示意如图。
    在这里插入图片描述
    不论join参数取值是inner或者outer,结果都是将两个表完全按照y轴拼接起来。
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)
  • append函数
    append方法也可以用于纵向合并两张表。但是append方法实现纵向表堆叠有一个前提条件,那就是两张表的列名需要完全一致。
print('堆叠前df3的大小为%s,df4的大小为%s。'%(df3.shape,df4.shape))
print('append纵向堆叠后的数据框大小为:',df3.append(df4).shape)

主键合并数据

主键合并,即通过一个或多个键将两个数据集的行连接起来,类似于SQL中的join。针对同一个主键存在两张包含不同字段的表,将其根据某几个字段一一对应拼接起来,结果集列数为两个元数据的列数和减去连接键的数量,如下图。
在这里插入图片描述
pandas库中的merge函数和join方法都可以实现主键合并,但两者实现的方式并不相同。

  • 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)

和数据库的join一样,merge函数也有左连接(left)、右连接(right)、内连接(inner)和外连接(outer),但比起数据库SQL语言中的join和merge函数还有其自身独到之处,例如可以在合并过程中对数据集中的数据进行排序等。

  • join方法
pandas.DataFrame.join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

堆叠合并数据

数据分析和处理过程中偶尔会出现两份数据内容几乎一致的情况,但是某些特征在其中一张表上是完整的,而在另外一张表上的数据则是缺失的。这时除了使用数据一对一比较,然后进行填充的方法外,还有一种方法就是重叠合并。pandas提供了combine_first方法来进行重叠数据合并。
在这里插入图片描述

##建立两个字典,除了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.DataFrame(dict2)
print('经过重叠合并后的数据为:\n',df5.combine_first(df6))

清洗数据

数据重复会导致数据方差变小,数据分布发生较大变化。缺失会导致样本信息减少,不仅增加了数据分析的难度,而且会导致数据分析的结果产生偏差。异常值则会产生“伪回归”。因此需要对数据进行检测,查询是否有重复值、缺失值和异常值,并且要对这些数据进行适当的处理。

检测与处理重复值

处理重复数据是数据分析经常面对的问题之一。对重复数据进行处理之前,需要分析重复数据产生的原因以及去除这部分数据后可能造成的不良影响。常见的数据重复分为两种:一种为记录重复,即一个或者多个特征某几个记录的值完全相同;另一种为特征重复,即存在一个或者多个特征名称不同,但数据完全相同的情况。

记录重复

  • 方法一是利用列表(list)去重,自定义去重函数
##方法一
##定义去重函数
def delRep(list1):
    list2=[]
    for i in list1:
        if i not in list2:
            list2.append(i)
    return list2 
## 去重
dishes=list(detail['dishes_name']) ##将dishes_name从数据框中提取出来
print('去重前菜品总数为:',len(dishes)) 
dish = delRep(dishes) ##使用自定义的去重函数去重
print('方法一去重后菜品总数为:',len(dish))
  • 方法二是利用集合(set)的元素是唯一的特性去重,如dish_set = set(dishes)
##方法二
print('去重前菜品总数为:',len(dishes)) 
dish_set = set(dishes) ##利用set的特性去重
print('方法二去重后菜品总数为:',len(dish_set))

比较上述两种方法可以发现,方法一代码冗长。方法二代码简单了许多,但会导致数据的排列发生改变。
pandas提供了一个名为drop_duplicates的去重方法。该方法只对DataFrame或者Series类型有效。这种方法不会改变数据原始排列,并且兼具代码简洁和运行稳定的特点。该方法不仅支持单一特征的数据去重,还能够依据DataFrame的其中一个或者几个特征进行去重操作。

##对dishes_name去重
dishes_name = detail['dishes_name'].drop_duplicates()
print('drop_duplicates方法去重之后菜品总数为:',len(dishes_name))
#使用drop_duplicates方法对多 
print('去重之前订单详情表的形状为:', detail.shape)
shapeDet = detail.drop_duplicates(subset = ['order_id',
    'emp_id']).shape
print('依照订单编号,会员编号去重之后订单详情表大小为:', shapeDet)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值