DataFrame的分箱cut
2020-11-28 本文已影响0人
Chaweys
import pandas as pd
pd.cut(x,bins,labels,right)
常用来把一组数据分割成离散的区间,即所有的数据都可以落在分割后的区间里
参数解释:
x: 被切分的类数组(array/Series)数组,必须是一维的
bins: 被切割后的区间,binxs=int值时,如bins=3表示将x平分成3份;
bins=sequence指定区间[0,59,70,80,100]
labels:表示分割后每个区间的名称(别名)
right: 表示左右的开和闭,默认为True=左开右闭,为False=左闭右开
#coding=utf-8
import pandas as pd
import numpy as np
#生成Series一维
series=np.random.randint(20,100,size=10)
print(series)
'''
[94 37 34 81 80 65 45 76 89 22]
'''
#对Series的所有数据进行切分成指定的3个区间
print(pd.cut(series,bins=3))
'''
[(70.0, 94.0], (21.928, 46.0], (21.928, 46.0], (70.0, 94.0], (70.0, 94.0], (46.0, 70.0], (21.928, 46.0], (70.0, 94.0], (70.0, 94.0], (21.928, 46.0]]
Categories (3, interval[float64]): [(21.928, 46.0] < (46.0, 70.0] < (70.0, 94.0]]
解释:
[(21.975, 30.333] < (30.333, 38.667] < (38.667, 47.0]]得到这么一个列表,即表示series里的所有数据,可以分成三个区间,
所有的数据都可以落在此3个区间里
'''
#对Series的所有数据进行切分成指定的3个区间,并指定是左闭右开
print(pd.cut(series,bins=3,right=False))
'''
[[70.0, 94.072), [22.0, 46.0), [22.0, 46.0), [70.0, 94.072), [70.0, 94.072), [46.0, 70.0), [22.0, 46.0), [70.0, 94.072), [70.0, 94.072), [22.0, 46.0)]
Categories (3, interval[float64]): [[22.0, 46.0) < [46.0, 70.0) < [70.0, 94.072)]
'''
#bins指定为一个列表进行对Series的所有数据进行分割,并指定是左闭右开
print(pd.cut(series,bins=[0,50,70,80,100],right=False))
'''
[[80, 100), [0, 50), [0, 50), [80, 100), [80, 100), [50, 70), [0, 50), [70, 80), [80, 100), [0, 50)]
Categories (4, interval[int64]): [[0, 50) < [50, 70) < [70, 80) < [80, 100)]
解释:
最后分割成区间:[[0, 50) < [50, 70) < [70, 80) < [80, 100)],即Series的所有数据都可以落在这些区间里
'''
#bins指定为一个列表进行对Series的所有数据进行分割,并指定是左闭右开,并为每个区间命名一个别名
print(pd.cut(series,bins=[0,50,70,80,100],right=True,labels=["low","middle","good","perfect"]))
'''
[good, low, middle, low, low, perfect, good, good, low, good]
Categories (4, object): [low < middle < good < perfect]
解释:
[low < middle < good < perfect]表示将Series的所有数据可分成4个区间,保证所有的数据都可以落在这4个区间里
[good, low, middle, low, low, perfect, good, good, low, good] 表示Series里的每个数落在具体的区间的名称
'''
#创建DataFrame,并指定列索引
df=pd.DataFrame(series,columns=["score"])
print(df)
'''
score
0 43
1 37
2 75
3 36
4 76
5 82
6 89
7 32
8 35
9 69
'''
#为此DataFrame增加两列,1分数的范围,2范围的别名
df["range"]=pd.cut(df.score,bins=[0,50,70,80,100])
df["labels"]=pd.cut(df.score,bins=[0,50,70,80,100],labels=["low","middle","good","perfect"])
print(df)
'''
score range labels
0 77 (70, 80] good
1 34 (0, 50] low
2 48 (0, 50] low
3 29 (0, 50] low
4 76 (70, 80] good
5 25 (0, 50] low
6 65 (50, 70] middle
7 29 (0, 50] low
8 81 (80, 100] perfect
9 21 (0, 50] low
'''
#统计对range里分组,统计分组后的个数
print(df.groupby("range").agg({"labels":"count"}))
'''
labels
range
(0, 50] 2
(50, 70] 5
(70, 80] 1
(80, 100] 2
'''