|
1.构建测试数据集
- import pandas as pd
- import numpy as np
- df = pd.DataFrame({
- 'Sex': ['M','F','M','M','M','F','M','F','F','F'],
- 'Course': ['English','C','Math','Python','Java','PHP','Linux','SQL','Python','C++'],
- 'Score': np.random.randint(0,100,10)
- })
- '''
- Sex Course Score
- 0 M English 22
- 1 F C 20
- 2 M Math 89
- 3 M Python 13
- 4 M Java 68
- 5 F PHP 49
- 6 M Linux 97
- 7 F SQL 5
- 8 F Python 15
- 9 F C++ 83
- '''
复制代码 2.自定义函数 + 循环遍历
- def myFun(x):
- if x > 90:
- return 'A'
- elif x >= 80 and x < 90:
- return 'B'
- elif x >= 70 and x < 80:
- return 'C'
- elif x >= 60 and x < 70:
- return 'D'
- else:
- return 'E'
-
- df['Score_label'] = None
- for i in range(len(df)):
- df.iloc[i, 3] = myFun(df.iloc[i, 2])
复制代码 3.自定义函数 + map
- df['Score_label_2'] = df['Score'].map(myFun)
复制代码 4.自定义函数 + apply
- df['Score_label_3'] = df['Score'].apply(lambda x: 'A' if x > 90
- else ('B' if 90 > x >= 80
- else ('C' if 80 > x >= 70
- else ('D' if 70 > x >= 60
- else 'E'))))
复制代码 apply执行速度堪忧,针对大数据量尽量避免。
5.pd.cut
- bins = [0, 59, 70, 80, 90, 100]
- df['Score_label_4'] = pd.cut(df['Score'], bins)
- # labels可以直接设定标签
- df['Score_label_4'] = pd.cut(df['Score'], bins, labels=['E','D','C','B','A'])
复制代码 注意:左右开闭区间的设定。
6.sklearn二值化
- from sklearn.preprocessing import Binarizer
- binarizer_ = Binarizer(threshold=60)
- df['Score_label_5'] = binarizer_.fit_transform(np.array(df['Score']).reshape(-1,1))
复制代码 7.replace替换
- df['Sex_label'] = df['Sex'].replace(['M','F'], [0,1])
复制代码 8.value_counts()转换dict指定
利用 value_counts() 进行去重统计,转换为标签。- value_map = dict((v, i) for i, v in enumerate(df['Course'].value_counts().index))
- df['Course_label'] = df.replace({'Course': value_map})['Course']
- 9.set + map
- Map = {v: i for i, v in enumerate(set(df['Course']))}
- '''
- {'Math': 0,
- 'C': 1,
- 'Linux': 2,
- 'English': 3,
- 'Java': 4,
- 'PHP': 5,
- 'C++': 6,
- 'Python': 7,
- 'SQL': 8}
- '''
- df['Course_label_2'] = df['Course'].map(Map)
复制代码 10.astype转换类型
- value = df['Course'].astype('category')
- df['Course_label_3'] = value.cat.codes
复制代码 转换为:类别类型。
11.sklearn.preprocessing.LabelEncoder
- from sklearn.preprocessing import LabelEncoder
- le = LabelEncoder()
- le.fit(df['Sex'])
- df['Sex_label_2'] = le.transform(df['Sex'])
- le2 = LabelEncoder()
- df['Course_label_4'] = le2.fit_transform(df['Course'])
复制代码 12.sklearn.preprocessing.OrdinalEncoder
一次性转换多个列,OrdinalEncoder 与 LabelEncoder 区别在于前者支持数组的转换,后者仅支持单独一列。- from sklearn.preprocessing import OrdinalEncoder
- le3 = OrdinalEncoder()
- le3.fit(df[['Sex', 'Course']])
- #学习中遇到问题没人解答?小编创建了一个Python学习交流群:725638078
- df[['Sex_label_3', 'Course_label_5']] = le3.transform(df[['Sex', 'Course']])
复制代码 13.factorize
以上几种自动生成字典的编码方式,基本都是无序的,不固定的。- # 根据出现的顺序编码
- df['Course_label_6'] = pd.factorize(df['Course'])[0]
复制代码 利用 factorize 可以实现顺序编码。
结合匿名函数,可以实现对多列进行有序编码。- cat_columns = df.select_dtypes(['object']).columns
- df[['Sex_label_4','Course_label_7']] = df[cat_columns].apply(lambda x: pd.factorize(x)[0])
复制代码 来源:https://www.cnblogs.com/djdjdj123/p/18294195
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|