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
'''
上一篇 下一篇

猜你喜欢

热点阅读