一、p分位数概念
原则上p是可以取0-1之间的任意值,四分位数是p分位数中较为有名的。
所谓四分位数:即把数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。
- 第1四分位数 (Q1):又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字
- 第2四分位数 (Q2):又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字
- 第3四分位数 (Q3):又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字
第3四分位数与第1四分位数的差距又称四分位距(InterQuartile Range, IQR)
二、pandas中quantile函数
quantile()
函数语法为:
DataFrame.quantile(q=0.5, axis=0, numeric_only=True, interpolation='linear')
参数解释:
q -- 浮点数或者数组,默认值0.5,取中位数(0 ≤ q ≤ 1)
axis -- 行或列,默认为0,取值为:{0, 1, ‘index’, ‘columns’}
0 or ‘index’ -- 行
1 or ‘columns’ -- 列
interpolation -- 插值方法,取值为:{‘linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’}
当选中的分位点位于两个数数据点 i and j 之间时:
linear: i + (j - i) * fraction, fraction由计算得到的pos的小数部分
lower: i.
higher: j.
nearest: i or j whichever is nearest.
midpoint: (i + j) / 2.
三、实例
# 测试数据
df = pd.DataFrame(np.array([[1, 1], [2, 10], [3, 100], [4, 100]]),columns=['a', 'b'])
'''
a b
0 1 1
1 2 10
2 3 100
3 4 100
'''
# 0.1分位数
df.quantile(0.1)
a 1.3
b 3.7
Name: 0.1, dtype: float64
# 0.5分位数(中位数)
df.quantile(0.5)
a 2.5
b 55.0
Name: 0.5, dtype: float64
# 测试数据
age sex
0 54.0 男
1 39.0 男
2 59.0 男
3 59.0 男
4 52.0 男
# 求分位数
data.age.quantile([0.25, 0.5, 0.75])
0.25 35.0
0.50 45.0
0.75 54.0
Name: age, dtype: float64
四、应用
在数据清洗过程中,可以利用分位数实现对异常数据的剔除。
- 盖帽法
# 盖帽法
def blk(floor, root):
def f(x):
if x < floor:
x = floor
elif x > root:
x = root
return x
return f
- 清洗
data["col"] = data["col"].map(blk(0, root=data["col"].quantile(0.99)))
- 缺失值填充
data["col"] = data["col"].fillna(0)
注意,需先通过盖帽法完成异常数据清洗后,再进行缺失值填充。
参考链接1:pandas中的quantile函数