数据合并连接
根据单个或多个键将不同DataFrame的行连接起来,类似数据库的连接操作。
直接合并【concat】
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import 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】
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44import 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
复制代码
1
2
3
4
5
6
7import 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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41# 默认操作内层索引 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
数据转换
处理重复数据
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import 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'))
数据替换 – 删除 ,替换,插入
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70import 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.] # 对于线性关系的数据 ---线性插值比较准确,多项式插值与 样条插值都不错, # 如果是线性关系的数据----都可以使用 # 对于非线性数据---线性插值效果较差,多项式插值与样条插值效果较好, # 如果是非线性关系的数据,---推荐使用多项式插值与样条插值
异常值的处理【正态分布,箱线图】
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58import 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)
最后
以上就是超帅豆芽最近收集整理的关于数据的清洗,合并,转化和重构的全部内容,更多相关数据内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复