import pandas as pd
impore numpy as np
1)纵向或横向堆叠 concat()
detail=pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C':['k0','k0','k1','k2'],
'D':['k0','k1','k0','k1'],
'E':['k0','k1','k1','k2'],
'F':['k0','k0','k0','k0'],
'G': ['C0', 'C1', 'C2', 'C3'],
'H': ['D0', 'D1', 'D2', 'D3'],
})
df1 = detail.iloc[0:3,:]
df2 = detail.iloc[2:4,:]
print(pd.concat([df1,df2],axis=1,join='inner')) #交集
print(pd.concat([df1,df2],axis=1,join='outer')) #并集
2)主键合并 merge()
left=pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key1':['k0','k0','k1','k2'],
'key2':['k0','k1','k0','k1'],
})
right=pd.DataFrame({
'key1':['k0','k1','k1','k2'],
'key2':['k0','k0','k0','k0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
})
print(pd.merge(left,right,how='right',on=['key1','key2']))
#以right表中key1,key2为主键合并
print(pd.merge(left,right,how='outer',on['key1','key2'],indicator=True))
#indicator=True显示表中数据来自合并前哪一个表
#outer 外合并 取并集
print(pd.merge(left, right, left_on='key2',right_on='key1',how='inner'))
print(pd.merge(left,right,how='inner',on=['key1','key2']))
#inner 内合并 取交集
3)重叠合并 combine_first()
left=pd.DataFrame({
'id': [1,2,3,4],
'B': ['B0', 'B1', 'B2', np.nan],
'key1':['k0',np.nan,'k1','k2'],
})
right=pd.DataFrame({
'id':[1,2,3,4],
'key1':[np.nan,'k0','k1','k2'],
'B': [np.nan, 'B1', 'B2', np.nan],
})
print(left.combine_first(right))
#以第一张表为准,用第二张表补齐,
1)检测处理重复值
right=pd.DataFrame({
'key1':['k0','k1','k1','k2'],
'key2':['k0','k0','k0','k1'],
'C': ['C0', 'C1', 'C1', 'C3'],
})
# 单列去重
print(right['key2'].drop_duplicates())
#多列去重
print(right.drop_duplicates(subset=['key1','key2'],keep='first'))
#两列同时重复才去重,keep(first/last/False)/保留第一个重复值/保留最后一个/都不保留
# 特征去重 相似度 corr 方法pearson/spearman/kendall
# 如果两列相似度为1的时候,去除其中的某一列:
# 弊端:只能求解数值型特征,类别型的无法通过计算相似度衡量
corrDet = right[['key1','key2']].corr(method='kendall')
2)检测处理缺失值
#判断 如果数据中某个或某些特征不完整,这些值为缺失值
right=pd.DataFrame({
'key1':['k0','k1','k1','k2'],
'key2':['k0',np.nan,'k0','k0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'np.nan', 'np.nan'],
})
print(right.isnull().sum())
print(right.notnull().sum())
#结合sum函数判断每个特征缺失值的总数目
#处理方法
#(1)删除 dropna() 删除比较简单容易引起数据结构变动,样本减少
right.dropna(axis=1,how='any',inplace=True)
#any 只要有缺失值就删, all 全是缺失值才删 axis(0/1)对行与列操作
#(2)替换 fillna() 替换法难度较低,但数据的标准差受影响,导致信息量变动
print(right.fillna(-99))
#空值替换成 -99
#(3)插值法
x = np.array([1, 2, 3, 4, 5, 8, 9, 10])
y1 = np.array([2, 8, 18, 32, 50, 128, 162, 200])
y2 = np.array([3, 5, 7, 9, 11, 17, 19, 21])
#线性插值,(根据已有数据,求出线性方程,通过求解线性方程得到缺失值)
from scipy.interpolate import interp1d
# 线性拟合方式
linearvalues = interp1d(x,y2,kind='linear')
pring(linearbalues([6,7]))
#根据x,y2 得出的线性公式,传入6,7 返回值
#多项式插值,(利用所以数据拟合一个多项式,使得所有的店都满足多项式,通过求解得到缺失值)
from scipy.interpolate import lagrange
# 拉格朗日插值法
lagrangevalues=lagrange(x,y1)
print(lagrangevalues([6,7]))
#样条插值 (由一些多项式组成,每个多项式由相邻的两个点决定)
from scipy.interpolate import spline
splinevaluel=spline(x,y1,xnew=np.array([6,7]))
print(splinevaluel)
3)检测处理异常值
异常值/野值–表示个别的数明显偏离其他的数值,也成为离群点
arrli = np.array([3, 5, 7, 9, 11, 17, 19, 200])
def outrange(data):
boolind=(data.mean() - 3 * data.std() > data) | (data.mean() + 3 * data.std() < data)
return data[boolind]
print(outrange(arrli ))
#返回异常值数组
标准化数据: 处理不同属性的量纲,需要将量纲统一
a = np.array([2, 3, 2, 4, 5, 8, 9, 10])
# (1)离差标准化
# x^* = (x -min)/(max - min) [0-1之间]
#缺点 (1)max=min ,(2)max很大,结果接近0,
def licha(data):
x = (data-data.min())/(data.max()-data.min())
return x
print(licha(a))
# (2)标准差标准化
#零均值标准化(将数据化为: 均值为0 ,方差为1)(负无穷,正无穷)
def zerohua(data):
x = (data-data.mean())/data.std()
return x
print(zerohua(a))
# (3)小数定标标准化
# 通过移动数据小数位数,将所有数映射到[-1,1]区间,移动的小数位数取决于最大值
def scaler(data):
return data/10**np.ceil(np.log(data.abs().max()))
print(scaler(a))
a = np.array(['北京','上海','广州','西藏','山西','云南'])
#1) 稀疏矩阵 哑变量处理(类别型数据)
print(pd.get_dummies(a))
#2)连续数据离散化
#等宽法 数据分布不均匀
a = np.random.randint(40,100,100)
pice =pd.cut(a,5)
print(pice.value_counts())
#返回5个区间内的a中数值出现的频率
#等频法
data = np.random.randint(40,100,100)
w = data.quantile(np.arange(0,1+1.0/3,1.0/3))
# print(np.arange(0,1+1.0/3,1.0/3)) # [0. 0.33333333 0.66666667 1. ]
# print(w)
print(pd.cut(data,w).value_counts())
#quantile 把data个数按照 np.arange(0,1+1.0/3,1.0/3) 分成3个区间,然后再使用cut()方法