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

Python学习 2024-07-10 16:09:00 阅读 77

1.构建测试数据集

<code>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])



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。