翼度科技»论坛 编程开发 python 查看内容

Python教程:Pandas数据转换编码的10种方式

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
1.构建测试数据集
  1. import pandas as pd
  2. import numpy as np
  3. df = pd.DataFrame({
  4.         'Sex': ['M','F','M','M','M','F','M','F','F','F'],
  5.         'Course': ['English','C','Math','Python','Java','PHP','Linux','SQL','Python','C++'],
  6.         'Score': np.random.randint(0,100,10)
  7.         })
  8. '''
  9.   Sex   Course  Score
  10. 0   M  English     22
  11. 1   F        C     20
  12. 2   M     Math     89
  13. 3   M   Python     13
  14. 4   M     Java     68
  15. 5   F      PHP     49
  16. 6   M    Linux     97
  17. 7   F      SQL      5
  18. 8   F   Python     15
  19. 9   F      C++     83
  20. '''
复制代码
2.自定义函数 + 循环遍历
  1. def myFun(x):
  2.     if x > 90:
  3.         return 'A'
  4.     elif x >= 80 and x < 90:
  5.         return 'B'
  6.     elif x >= 70 and x < 80:
  7.         return 'C'
  8.     elif x >= 60 and x < 70:
  9.         return 'D'
  10.     else:
  11.         return 'E'
  12.    
  13. df['Score_label'] = None
  14. for i in range(len(df)):
  15.     df.iloc[i, 3] = myFun(df.iloc[i, 2])
复制代码
3.自定义函数 + map
  1. df['Score_label_2'] = df['Score'].map(myFun)
复制代码
4.自定义函数 + apply
  1. df['Score_label_3'] = df['Score'].apply(lambda x: 'A' if x > 90
  2.   else ('B' if 90 > x >= 80
  3.         else ('C' if 80 > x >= 70
  4.               else ('D' if 70 > x >= 60
  5.                     else 'E'))))
复制代码
apply执行速度堪忧,针对大数据量尽量避免。
5.pd.cut
  1. bins = [0, 59, 70, 80, 90, 100]
  2. df['Score_label_4'] = pd.cut(df['Score'], bins)
  3. # labels可以直接设定标签
  4. df['Score_label_4'] = pd.cut(df['Score'], bins, labels=['E','D','C','B','A'])
复制代码
注意:左右开闭区间的设定。
6.sklearn二值化
  1. from sklearn.preprocessing import Binarizer
  2. binarizer_ = Binarizer(threshold=60)
  3. df['Score_label_5'] = binarizer_.fit_transform(np.array(df['Score']).reshape(-1,1))
复制代码
7.replace替换
  1. df['Sex_label'] = df['Sex'].replace(['M','F'], [0,1])
复制代码
8.value_counts()转换dict指定

利用 value_counts() 进行去重统计,转换为标签。
  1. value_map = dict((v, i) for i, v in enumerate(df['Course'].value_counts().index))
  2. df['Course_label'] = df.replace({'Course': value_map})['Course']
  3. 9.set + map
  4. Map = {v: i for i, v in enumerate(set(df['Course']))}
  5. '''
  6. {'Math': 0,
  7. 'C': 1,
  8. 'Linux': 2,
  9. 'English': 3,
  10. 'Java': 4,
  11. 'PHP': 5,
  12. 'C++': 6,
  13. 'Python': 7,
  14. 'SQL': 8}
  15. '''
  16. df['Course_label_2'] = df['Course'].map(Map)
复制代码
10.astype转换类型
  1. value = df['Course'].astype('category')
  2. df['Course_label_3'] = value.cat.codes
复制代码
转换为:类别类型。
11.sklearn.preprocessing.LabelEncoder
  1. from sklearn.preprocessing import LabelEncoder
  2. le = LabelEncoder()
  3. le.fit(df['Sex'])
  4. df['Sex_label_2'] = le.transform(df['Sex'])
  5. le2 = LabelEncoder()
  6. df['Course_label_4'] = le2.fit_transform(df['Course'])
复制代码
12.sklearn.preprocessing.OrdinalEncoder

一次性转换多个列,OrdinalEncoder 与 LabelEncoder 区别在于前者支持数组的转换,后者仅支持单独一列。
  1. from sklearn.preprocessing import OrdinalEncoder
  2. le3 = OrdinalEncoder()
  3. le3.fit(df[['Sex', 'Course']])
  4. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:725638078
  5. df[['Sex_label_3', 'Course_label_5']] = le3.transform(df[['Sex', 'Course']])
复制代码
13.factorize

以上几种自动生成字典的编码方式,基本都是无序的,不固定的。
  1. # 根据出现的顺序编码
  2. df['Course_label_6'] = pd.factorize(df['Course'])[0]
复制代码
利用 factorize 可以实现顺序编码。
结合匿名函数,可以实现对多列进行有序编码。
  1. cat_columns = df.select_dtypes(['object']).columns
  2. 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】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具