数据的清洗,合并,转化和重构

数据合并连接

根据单个或多个键将不同DataFrame的行连接起来,类似数据库的连接操作。

直接合并【concat】
import pandas

# 直接拼接【concat】
# 加载数据
data_1 = pandas.read_excel('data_file/concat数据拼接.xlsx',sheetname=0)
data_2 = pandas.read_excel('data_file/concat数据拼接.xlsx',sheetname=1)
print(data_1,'\n',data_2)

# 利用concat 进行拼接
# 【行的方向拼接 axis = 0】
# outer 代表外连接,在行的方向上直接拼接,列的方向上求列的并集
res = pandas.concat((data_1,data_2),axis=0,join='outer')
print(res)
# inner 代表内连接,在行的方向上直接拼接,列的方向上求列的交集
res = pandas.concat((data_1,data_2),axis=0,join='inner')
print(res)

print('-*'*40)
# 【列的方向拼接 axis = 1】
# outer 代表外连接,在列的方向上直接拼接,行的方向上求列的并集
res = pandas.concat((data_1,data_2),axis=1,join='outer')
print(res)
# inner 代表内连接,在列的方向上直接拼接,行的方向上求列的交集
res = pandas.concat((data_1,data_2),axis=1,join='inner')
print(res)
主键拼接 【merge】
import pandas

# 主键拼接 【merge】 --- 没有行的方向上的拼接

data_1 = pandas.read_excel("data_file/merge拼接数据.xlsx",sheetname=0)
data_2 = pandas.read_excel("data_file/merge拼接数据.xlsx",sheetname=1)

print("data_1:\n",data_1)
print("data_2:\n",data_2)

# 拼接方式
#  how  = {'left', 'right', 'outer', 'inner'}
# on  就是 值一样的列

#  left  ---left outer 左外连接  key 列只关系 左表,右表不关心
res = pandas.merge(left=data_1,right=data_2,how='left',on='key')
print(res)
# right  right outer 右外连接,  key 列只关系 右表,左表不关心
res = pandas.merge(left=data_1,right=data_2,how='right',on='key')
print(res)
# outer -  外连接  key值的列 求并集
res = pandas.merge(left=data_1,right=data_2,how='outer',on='key')
print(res)
# inner -  内连接  key值的列 求交集
res = pandas.merge(left=data_1,right=data_2,how='inner',on='key')
print(res)


# 特例
# 左表的列的名称 与右表的列的名称 没有一样的,但是里面的数据是一样
data_1 = pandas.read_excel("data_file/merge拼接数据1.xlsx",sheetname=0)
data_2 = pandas.read_excel("data_file/merge拼接数据1.xlsx",sheetname=1)
#left_on,左侧数据的“外键”,right_on,右侧数据的“外键”
# res =pandas.merge(left=data_1,right=data_2,how='left',left_on='key_l',right_on='key_r')
# res=pandas.merge(left=data_1,right=data_2,how='right',left_on='key_l',right_on='key_r')
# res=pandas.merge(left=data_1,right=data_2,how='outer',left_on='key_l',right_on='key_r')
res = pandas.merge(left=data_1,right=data_2,how='inner',left_on='key_l',right_on='key_r')
print(res)

数据重构

stack

将列索引旋转为行索引,完成层级索引,DataFrame->Series

import numpy as np
import pandas as pd

df_obj = pd.DataFrame(np.random.randint(0,10, (5,2)), columns=['data1', 'data2'])
print(df_obj)

stacked = df_obj.stack()
print(stacked)
unstack

将层级索引展开,Series->DataFrame

# 默认操作内层索引
print(stacked.unstack())
输出:
   data1  data2
0      7      9
1      7      8
2      8      9
3      4      1
4      1      2
# 通过level指定操作索引的级别
print(stacked.unstack(level=0))
输出:
       0  1  2  3  4
data1  7  7  8  4  1
data2  9  8  9  1  2

数据转换

处理重复数据
import pandas


# 加载数据
data = pandas.read_excel('data_file/meal_order_detail.xlsx')
print(data.shape)


# 对数据中的amounts 进行去重,拿到 菜的单价数据-来评估这家餐厅的消费水平
# subset -指定要去重的数据
# 只有同列 才能进行去重

res = data.drop_duplicates(subset='amounts',inplace=False)
print(res.shape)


# 衡量【coor()】 count 与amounts之间的相关性
# 0 < corr 正相关
# 0 > corr 负相关
#  method  =  默认是皮尔逊相关系数
# spearman -----斯皮尔曼相关系数
print(data.loc[:,['counts','amounts']].corr())
print(data.loc[:,['counts','amounts']].corr(method='spearman'))
数据替换 – 删除 ,替换,插入
import numpy
import pandas

# 加载数据

data = pandas.read_excel('data_file/qs.xlsx',sheetname=0)
'''
# 检测缺失值
print(data.isnull()) #True表示缺失值
print(data.notnull()) #Flase表示缺失值

# 统计缺失值
# sum 统计的是true 所以建议使用isnull
print(data.isnull().sum())
print(data.notnull().sum())
'''

'''
# 缺失值的处理
# 删除 ----会对数据产生很大的影响,造成数据缺失,所以在数据大部分为缺失值,才使用删除法
#axis=【行0列1】
# how=【删除方式,any=只要有缺失值,就删除[整行或者整列],all=只有整列或者整行都是缺失值,才删除】
# inplace=【是否影响原数据】
# data.dropna(axis=1,how='any',inplace=True)
# print(data)


# 填充  --- 填充之后对结果影响不大的情况,可以使用
# 为了对整体的数据不产生影响,,一般使用 --- 均值,中位数,众数【类别型数据】来进行填充
# 众数
mode = data.loc[:,'商品ID'].mode()[0]
data.loc[:,'商品ID'].fillna(value=mode,inplace=True)
mode = data.loc[:,'类别ID'].mode()[0]
data.loc[:,'类别ID'].fillna(value=mode,inplace=True)
mode = data.loc[:,'门店编号'].mode()[0]
data.loc[:,'门店编号'].fillna(value=mode,inplace=True)
print(data)

print('-*'*40)
# 对于一些非空值的特殊符号的处理
# 先将其转化为缺失值,在进行处理
data.replace(to_replace='*',value=numpy.nan,inplace=True)
mode = data.loc[:,'门店编号'].mode()[0]
data.loc[:,'门店编号'].fillna(value=mode,inplace=True)
print(data)
'''


# 插值
x = numpy.array([1,2,3,4,5,8,9])
y = numpy.array([3,5,7,9,11,17,19])
z = numpy.array([2,8,18,32,50,128,162])
# 线性插值,多项式插值,样条插值
# 线性插值 -- 拟合线性关系进行插值
from scipy.interpolate import interp1d
line1 = interp1d(x,y,kind='linear')
line2 = interp1d(x,z,kind='linear')

print(line1([6,7])) # [13. 15.]
print(line2([6,7])) # [ 76. 102.]
# 多项式插值 -- 牛顿插值法,拉格朗日插值法
# 拟合牛顿多项式 与 拉格朗日多项式
from scipy.interpolate import lagrange
la1 = lagrange(x,y)
la2 = lagrange(x,z)

print(la1([6,7])) # [13. 15.]
print(la2([6,7])) # [72. 98.]

# 样条插值 -- 拟合曲线关系进行插值
from scipy.interpolate import spline
print(spline(xk=x,yk=y,xnew=numpy.array([6,7]))) # [ 13.  15.]
print(spline(xk=x,yk=z,xnew=numpy.array([6,7]))) # [ 72.  98.]

#  对于线性关系的数据 ---线性插值比较准确,多项式插值与 样条插值都不错,
# 如果是线性关系的数据----都可以使用

# 对于非线性数据---线性插值效果较差,多项式插值与样条插值效果较好,
# 如果是非线性关系的数据,---推荐使用多项式插值与样条插值

异常值的处理【正态分布,箱线图】

import numpy
import pandas

# 根据正太分布得出 99.73%的数据都在[u-3sigma ,u+3sigma ]之间,
# 那么我们人为超出这个区间的数据为异常值
# 剔除异常值----保留数据在[u-3sigma ,u+3sigma ]之间
def three_sigma(data):
    
    # sigma 异常值删除
    # :param data: 传入数据
    # :return: 剔除之后的数据,或者剔除异常值之后的行索引名称
    
    bool_id_1 = (data.mean()-3*data.std()) <= data
    bool_id_2 = (data.mean()+3*data.std()) >= data

    bool_num = bool_id_1 & bool_id_2

    return bool_num
# # 以 detail 为例 展示以amounts 进行异常值剔除,查看detail结果
# 加载数据
detail = pandas.read_excel('data_file/meal_order_detail.xlsx',sheetname=0)
print(detail.shape)
# 调用函数 进行detail中amount的异常值剔除
bool_num = three_sigma(detail.loc[:,'amounts'])

# 获取正常的detail
detail = detail.loc[bool_num,:]

print(detail.shape)

# 箱线图分析
arr = pandas.Series(numpy.array([1,2,3,4,5,6,7,8,9,10]))
print(arr.quantile(0.5))
detail = pandas.read_excel('data_file/meal_order_detail.xlsx',sheetname=0)
#  75 % 的数  qu
#  25% 的数  ql
# 下限 <= 正常 <= 上限
# 上限:qu + 1.5*iqr  
# 下限 :ql - 1.5*iqr

def box_analysis(data):
    '''
    进行箱线图分析,剔除异常值
    :param data: series
    :return: bool数组
    '''
    qu = data.quantile(0.75)
    ql = data.quantile(0.25)
    iqr = qu - ql
    # 上限
    up = qu + 1.5*iqr
    # 下限
    low = ql - 1.5*iqr

    #进行比较运算
    bool_id_1 = data <= up
    bool_id_2 = data >= low

    bool_num = bool_id_1 & bool_id_2

    return bool_num
bool_num = box_analysis(detail.loc[:,'amounts'])
detail = detail.loc[bool_num,:]
print(detail.shape)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值