目录
1. Python连续变量重分类
1.1 等宽重编码
1.2 等频重编码
2. 离散变量重分类
2.1 分类后为1个指标
2.2 分类后为多个指标
cut( )函数
新变量 = pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
# x:待分类的变量
# bins:分段的依据
# right:right=True表示分段后包含右边的数,即左开又闭(X,X]
# labels:分类后新的分类标签,若不修改默认以(X,X]/[X,X) 的格式显示
# 其他参数详见:help(pd.cut)
案例 :
一份df格式的2020年的人口数据,数值为连续型,最小值为0,最大值为109695.39。现在需要分段为0,(0,100]、(100,300]、(300,500]、(500,700]、(700,900]、(900,1100]、(1100,1300]、1300及以上9类。
#格式左开右闭,从零开始(XX],bins需要加一个最大值
bins = [0,100,200,300,500,700,900,1100,1300,max(df['2020'])] #10个数,9个空格,产生9类
df['2020分层'] = pd.cut(df['2020'],bins,right=True)
#给重分类结果添加标签
bins = [0,100,200,300,500,700,900,1100,1300,max(Wpop2['2020'])]
df['2020分层'] = pd.cut(df['2020'],bins,right=True,labels=[1,2,3,4,5,6,7,8,9])
没有添加labels | 添加了labels之后 |
#若要进一步统计各分段的频数
df['2020分层'].value_counts()
Out[1]:
(1300.0, 109695.391] 2083
(0.0, 100.0] 1558
(100.0, 200.0] 893
(300.0, 500.0] 642
(500.0, 700.0] 537
(200.0, 300.0] 489
(700.0, 900.0] 408
(900.0, 1100.0] 320
(1100.0, 1300.0] 245
Name: 2020分层, dtype: int64
#若要进一步统计各分段的百分比
df['2020分层'].value_counts(normalize=True)
Out[2]:
(1300.0, 109695.391] 0.290314
(0.0, 100.0] 0.217143
(100.0, 200.0] 0.124460
(300.0, 500.0] 0.089477
(500.0, 700.0] 0.074843
(200.0, 300.0] 0.068153
(700.0, 900.0] 0.056864
(900.0, 1100.0] 0.044599
(1100.0, 1300.0] 0.034146
Name: 2020分层, dtype: float64
案例 :一份df格式的2020年的人口数据,数值为连续型,最小值为0,最大值为109695.39。现在按照25%的数据为一类,分成4类。
# 等频重编码
k=4 # 将数据k等分
w = df['2020'].quantile(np.arange(0,1+1/k,1/k)) # 获得k等分的临界值
df['2020分层'] = pd.cut(df['2020'], w, right=True, labels=[1,2,3,4]) # 重分类
w
Out[1]:
0.00 13.161950
0.25 652.074890
0.50 1648.612183
0.75 4138.446777
1.00 112781.359375
没有添加labels | 添加了labels之后 |
案例:先建立一个数据框,方便后面演示。我们的任务是,将性别用英文字母F、M表示。
df = pd.DataFrame([['张三','男','喜欢'],['李四','女','不喜欢'],['赵五','女','无所谓'],['王六','男','喜欢']])
df.columns=('姓名','性别','是否喜欢看电影')
df
Out[1]:
姓名 性别 是否喜欢看电影
0 张三 男 喜欢
1 李四 女 不喜欢
2 赵五 女 无所谓
3 王六 男 喜欢
方法:通过设立字典的形式,采用【变量.map()】重编码
# 方法一,用设立字典的形式,采用【变量.map()】挨个重编码
size_mapping = {'男':'M','女':'F'} # 也可以是数值型 size_mapping = {'男':'0','女':'1'}
df['性别'] = df['性别'].map(size_mapping)
df
Out[2]:
姓名 性别 是否喜欢看电影
0 张三 M 喜欢
1 李四 F 不喜欢
2 赵五 F 无所谓
3 王六 M 喜欢
扩展:对应R语言car包中的recode()函数
R例子:df$nsex=recode(df$sex,"'男'='M';'女'='F';else=NA")
另外,Python提供了一种可以可以把各个分类变量单独表示出来的形式,用【 pd.get_dummies( )】函数实现。
a = pd.get_dummies(df['性别'])
df['Femal'] = a['女']
df['male'] = a['男']
a
Out[1]:
女 男
0 0 1
1 1 0
2 1 0
3 0 1
df
Out[2]:
姓名 性别 是否喜欢看电影 Femal male
0 张三 男 喜欢 0 1
1 李四 女 不喜欢 1 0
2 赵五 女 无所谓 1 0
3 王六 男 喜欢 0 1
扩展阅读:
利用python将连续指标离散化,分类变量哑元化_weixin_30339969的博客-CSDN博客