ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pandas对分类数据编码

2022-07-10 11:05:11  阅读:200  来源: 互联网

标签:数据编码 Name df 分类 Label Course print copy Pandas


原文地址:https://mp.weixin.qq.com/s/8BFdFvTyP5NkJ1YZp52vEg

Pandas对分类数据编码

import pandas as pd
from sklearn.preprocessing import Binarizer, LabelEncoder, OrdinalEncoder

df = pd.DataFrame(
    {'Sex': ['Male', 'Female', 'Male', 'Male', 'Male',
             'Female', 'Male', 'Male', 'Female', 'Female'],
     'Course Name': ['Python', 'Java', 'C', 'Sql', 'Linux', 'Python', 'Python', 'Java', 'C', 'Php'],
     'Score': [95, 85, 75, 65, 55, 95, 75, 65, 55, 85]
     }
)

数值型数据【Score列打标签】

让我们先来讨论连续型数据的转换,
也就是根据Score列的值,
来新增一列标签,即如果分数大于90,则标记为A,分数在80-90标记为B,以此类推。

1. 自定义函数 + for

df1 = df.copy()


def myfun(x):
    if x > 90:
        return 'A'
    elif 80 <= x < 90:
        return 'B'
    elif 70 <= x < 80:
        return 'C'
    elif 60 <= x < 70:
        return 'D'
    else:
        return 'E'


df1['Score_Label'] = None
for i in range(len(df1)):
    df1.iloc[i, 3] = myfun(df1.iloc[i, 2])
print(df1)

2. 自定义函数 + map

def map_fun(x):
    if x > 90:
        return 'A'
    elif 80 <= x < 90:
        return 'B'
    elif 70 <= x < 80:
        return 'C'
    elif 60 <= x < 70:
        return 'D'
    else:
        return 'E'

df2 = df.copy()
df2['Score_Label'] = df2['Score'].map(map_fun)
print(df2)

3. 自定义函数+apply

  1. map、apply在用于Series时,对每一个值进行处理,两者并没有什么区别。(是否受数据量影响可以自行验证)
  2. apply不仅可以用于Series,还可以用于DataFrame;而map只能用于Series。
  3. 一般情况下,apply应用更广泛,尤其是自定义函数带多个参数时,建议使用apply。
df3 = df.copy()
df3['Score_Label'] = df3['Score'].apply(map_fun)
print(df3)

4. 使用pd.cut切分数据

df4 = df.copy()
bins = [0, 60, 70, 80, 90, 100]
# bins把数据域切分成0~60,。。。,90~1005个区间
df4['Score_Label'] = pd.cut(df4['Score'], bins=bins, labels=['E', 'D', 'C', 'B', 'A'])
print(df4)

5. 使用 sklearn的二值化

如果需要新增一列并判定成绩是否及格,就可以使用Binarizer函数

df5 = df.copy()
binarizer = Binarizer(threshold=60)
trans = binarizer.fit_transform(df5['Score'].to_numpy().reshape(-1, 1))
df5['是否及格'] = trans
print(df5)

文本型数据打标签

对文本数据进行转换打标签。例如将性别男、女分别标记为0、1

print('1. 使用replace,但要注意的是,上面说过的自定义函数相关方法依旧是可行的')
df6 = df.copy()
df6['Sex_Label'] = df6['Sex'].replace(['Male', 'Female'], [0, 1])
print(df6)

使用value_counts来自动指定标签【Course Name多类别】

df6 = df.copy()
value = df6['Course Name'].value_counts()
print(type(value))
value_map = dict(
    (v, i) for i, v in enumerate(value.index)
)
print(value, value_map)
df6['Course Name Label'] = df6.replace(
  {'Course Name': value_map}
)['Course Name']
print(df6)

使用map:新增一列,一定要能够想到map

df7 = df.copy()
Map = {elem: index for index, elem in enumerate(set(df["Course Name"]))}
df7['Course Name_Label'] = df7['Course Name'].map(Map)
print(df7)

使用使用astype

df8 = df.copy()
value = df8['Course Name'].astype('category')
df8['Course Name_Label'] = value.cat.codes
print(df8)

5. 使用sklearn LabelEncoder

df9 = df.copy()
le = LabelEncoder()
le.fit(df['Sex'])
df9['Sex_Label'] = le.transform(df9['Sex'])
le.fit(df9['Course Name'])
df9['Course Name Label'] = le.transform(df9['Course Name'])
print(df9)

6. 一次性转换两列也是可以的

df9 = df.copy()
oe = OrdinalEncoder()
oe.fit(df9[['Sex', 'Course Name']])
df9[['Sex_Label', 'Course Name Label']] = oe.transform(
  df9[['Sex', 'Course Name']]
)
print(df9)

7. 我们希望 Python 对应 0,Java对应1,使用factorize,它会根据出现顺序进行编码

df10 = df.copy()
df10['Course Name_Label'] = pd.factorize(df10['Course Name'])[0]
print(df10)

结合匿名函数,我们可以做到对多列进行有序编码转换

df11 = df.copy()
cat_columns = df10.select_dtypes(['object']).columns

df11[['Sex_Label', 'Course Name_Label']] = df10[cat_columns].apply(
    lambda x: pd.factorize(x)[0])

标签:数据编码,Name,df,分类,Label,Course,print,copy,Pandas
来源: https://www.cnblogs.com/bai7/p/16462738.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有