概述
数据合并连接
根据单个或多个键将不同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)
最后
以上就是超帅豆芽为你收集整理的数据的清洗,合并,转化和重构的全部内容,希望文章能够帮你解决数据的清洗,合并,转化和重构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复