合并表
1. 表堆叠 – concat()函数
堆叠:根据行、列索引进行表的拼接,而不看元素的值
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
参数含义
- objs:Series,DataFrame或Panel对象的序列或映射。如果传递了dict,则排序的键将用作键参数,除非它被传递,在这种情况下,将选择值(见下文)。任何无对象将被静默删除,除非它们都是无,在这种情况下将引发一个ValueError。
- axis:{0,1,…},默认为0。沿着连接的轴。
- join:{‘inner’,‘outer’},默认为“outer”。如何处理其他轴上的索引。outer为联合和inner为交集。
- ignore_index:boolean,default False。如果为True,请不要使用并置轴上的索引值。结果轴将被标记为0,…,n-1。如果要连接其中并置轴没有有意义的索引信息的对象,这将非常有用。注意,其他轴上的索引值在连接中仍然受到尊重。
- join_axes:Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。
- keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。
- levels:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。
- names:list,default无。结果层次索引中的级别的名称。
- verify_integrity:boolean,default False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。
- copy:boolean,default True。如果为False,请勿不必要地复制数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读取数据
data1 = pd.read_excel("meal_order_detail.xlsx",sheet_name=0)
data2 = pd.read_excel("meal_order_detail.xlsx",sheet_name=1)
#对两个表数据进行组合
all_data1 = pd.concat((data1,data2),axis=0,join="outer")
all_data2 = pd.concat((data1,data2),axis=1,join="inner")
print(data1.shape)
print(data2.shape)
print(all_data1.shape)
2. 主键合并 marge()函数 通过键拼接列
根据表中的元素取值是否相同来进行拼接(以左表为主,不考虑右表),跟行列索引无关
pandas提供了一个类似于关系数据库的连接(join)操作的方法merage,可以根据一个或多个键将不同DataFrame中的行连接起来
用于通过一个或多个键将两个数据集的行连接起来,类似于 SQL 中的 JOIN。
该函数的典型应用场景是:针对同一个主键存在两张包含不同字段的表,现在我们想把他们整合到一张表里。在此典型情况下,结果集的行数并没有增加,列数则为两个元数据的列数和减去连接键的数量。
- on=None 用于显示指定列名(键名),如果该列在两个对象上的列名不同,则可以通过 left_on=None, right_on=None 来分别指定。或者想直接使用行索引作为连接键的话,就将 left_index=False, right_index=False 设为True。
- how=‘inner’ 参数指的是当左右两个对象中存在不重合的键时,取结果的方式:inner 代表交集;
- 代表并集;left 和 right 分别为取一边。
- suffixes=(’_x’,’_y’) 指的是当左右对象中存在除连接键外的同名列时,结果集中的区分方式,可以各加一个小尾巴。
- 对于多对多连接,结果采用的是行的笛卡尔积。
语法
merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
- left与right:两个不同的DataFrame
- how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner
- on : 指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
- left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
- right_on:右则DataFrame中用作 连接键的列名
- left_index:使用左则DataFrame中的行索引做为连接键
- right_index:使用右则DataFrame中的行索引做为连接键
- sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能
- suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’,’_y’)
- copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
- indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
#一个主键、默认左内连接(等同于内连接),how后面只能跟一个值
data1 = pd.merge(left,right,how="outer",on="key1")
#多个主键
data2 = pd.merge(left,right,how="inner",on=["key1","key2"])
# data3 = pd.merge(left,right,how="left",on=["key1","key2"])
# data4= pd.merge(left,right,how="right",on=["key1","key2"])
# print(data1)
# print(data2)
#当两个表中,两个主键名称不一样时
data5 = pd.merge(left,right,how="inner",left_on="key2",right_on="key1")
# print(data5)
3. 重叠合并combine_first()函数
- 当两个表结构基本相同,但是两个表中都有缺失数据,可以利用重叠合并来拼凑数据,构建一个完整的表
- df1.combine_first(df2):利用df2来完善df1,当df1、df1中都有数据的时候以df1为准
dict1 = {'ID':[1,2,3,4,5,6,7,8,9],
'System':['W10','w10',np.nan,'w10',np.nan,np.nan,'w7','w7','w8']}
dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
'System':[np.nan,np.nan,'w7','w7','w7','w7','w8',np.nan,np.nan]}
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
# print(df1)
# print(df2)
#以前表作为基表
res1 = df1.combine_first(df2)
res2 = df2.combine_first(df1)
# print(res1)
# print(res2)
4.join 拼接列,主要用于索引上的合并
join方法提供了一个简便的方法用于将两个DataFrame中的不同的列索引合并成为一个DataFrame
语法
join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False)
其中参数的意义与merge方法基本相同,只是join方法默认为左外连接how=left
1.默认按索引合并,可以合并相同或相似的索引,不管他们有没有重叠列。
2.可以连接多个DataFrame
3.可以连接除索引外的其他列
4.连接方式用参数how控制
5.通过lsuffix=’’, rsuffix=’’ 区分相同列名的列
参考链接:https://blog.youkuaiyun.com/zutsoft/article/details/51498026
数据清洗
1.检测处理空值、缺失值
- isnull,notnull
#获取每列空值的总和
isnull_sum = detail.isnull().sum()
#若整列值都为空时则删除该列
mask = detail.shape[0]==isnull_sum
#
labels = mask.index[mask]
detail.drop(labels,axis=1,inplace=True)
- dropna(),删除缺失值how=“any”/“all”
detail.dropna(axis=0,how="any",inplace=True)
- fillna 填充空值
detail1 = detail.fillna(0)
- 插值法
(1)interp1d 线性拟合插值, 1d,不是ld
from scipy.interpolate import interp1d
x = np.array([1, 2, 3, 4, 5, 8, 9, 10])
y1 = np.array([2, 8, 18, 32, 50, 128, 162, 200])#2*n^2
y2= np.array([3, 5, 7, 9, 11, 17, 19, 21])#2n+1
Linear1= interp1d(x,y2,kind="linear")#线性拟合插值
Linear2= interp1d(x,y1,kind="linear")#线性拟合插值
print(Linear1([6,7]))
(2)lagrange 拉格朗日插值
from scipy.interpolate import lagrange
Larg1 = lagrange(x,y1)
Larg2 = lagrange(x,y2)
print(Larg2([6,7]))
(3)spline 样条数据插值
from scipy.interpolate import spline
res = spline(x, y1, xnew=np.array([6, 7]))
print(res)
2. 检测处理重复值
- 单列去重 (去行)
- 类似numpy中的unique,去除数组重复值
- keep:保留第几个重复值,默认为first、last、False:都不保留
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
right = pd.DataFrame({'key1': ['K0', 'K1', 'K0', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': [1, 1, 2, 3],
'D': [2, 2, 4, 6],
"E": [1, 1, 4, 5]
})
data_drop = right["key1"].drop_duplicates(keep=False)
- 表去重(多行去重)
shape_det = right.drop_duplicates(subset=["key1","key2"])
- 特征重复(去列) 计算相似度
corr_det = right[["C","D","E"]].corr(method="pearson")#spearman
mask = corr_det==1
print(mask)
3. 异常值 3西格玛原则
columns_num = ["单价","销量"]
for column in columns_num:
#异常值,x<u-3西格玛 | x>u-3西格玛
mask1 = order[column]<order[column].mean()-3*order[column].std()
mask2 = order[column]>order[column].mean()+3*order[column].std()
mask = mask1|mask2
# print(mask)
index_exception = order.index[mask]
order.drop(index_exception,axis=0,inplace=True)
4. 标准化方式
(1)离差标准化 (x-min)/(max-min)
data1 = (detail1["amounts"] - detail1["amounts"].min()) / (detail1["amounts"].max() - detail1["amounts"].min())
(2)标准差标准化 x1 = x-u/σ
data2 = (detail1["amounts"]-detail1["amounts"].mean())/detail1["amounts"].std()
(3)小数定标标准化x1 = x/10^k
data3= detail1["amounts"]/10**(np.log10(detail1["amounts"].abs().max()))
5. 哑变量处理
- 将类别型数据转换为one-hot编码—>数值型矩阵
data4 = pd.get_dummies(detail1["dishes_name"].head())
6. 离散化联系型数据
- value_counts()是统计每一列中不同类别各有多少个,此方法只适用于series序列类型
(1)等宽法切割:可能使得不同的类别频率差值较大
# 将数据平均分成5个区间
#value_counts()是统计每一列中不同类别各有多少个,此方法只适用于series序列类型
data5 = pd.cut(detail1["amounts"],5)
print(data5.value_counts())
(2)等频法切割:
data6 = pd.qcut(detail1["amounts"],5)
print(data6.value_counts())