Python教程:Pandas資料轉換編碼的10種方式

Python探索牛發表於2024-07-10

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

相關文章