在 Pandas DataFrame 中規範化一列

Sathiya Sarathi 2023年10月10日
  1. Pandas 中的資料歸一化
  2. mean 歸一化來歸納 Pandas DataFrame
  3. 最小-最大 歸一化方法對 Pandas DataFrame 進行歸一化
  4. 使用 分位數 歸一化對 Pandas DataFrame 進行歸一化
在 Pandas DataFrame 中規範化一列

資料的標準化或歸一化是特徵工程的第一步。列的歸一化將涉及到把列的值帶到一個共同的尺度,主要是針對範圍不同的列進行的。在 Pandas 中,可以通過各種函式對 Dataframes 的列進行歸一化。本文將幫助你練習這些函式,並幫助你在正確的情況下應用這些函式。

Pandas 中的資料歸一化

有兩種最廣泛使用的資料歸一化方法。

  • 平均值歸一化
  • 最小-最大歸一化
  • 量子化標準化

在 Pandas 中並沒有任何特定的方法來執行資料歸一化。我們將解釋這些歸一化是什麼,以及如何使用原生 Pandas 和一點原生 python 函式來實現它。

我們將在各個地方使用下面的程式碼段來建立一個帶有隨機元素的 DataFrame,如下圖所示,它將返回一個類似的 DataFrame。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))
print(df)

它將返回一個類似的 DataFrame,如下所示。

     A   B   C   D
0   72 -53  17  92
1  -33  95   3 -91
2  -79 -64 -13 -30
3  -12  40 -42  93
4  -61 -13  74 -12
5  -19  65 -75 -23
6  -28 -91  48  15
7   97 -21  75  92
8  -18  -1  77 -71
9   47  47  42  67
10 -68  93 -91  85
11  27 -68 -69  51
12  63  14  83 -72
13 -66  28  28  64
14 -47  33 -62 -83
15 -21  32   5 -58
16  86 -69  20 -99
17 -35  69 -43 -65
18   2  19 -89  74
19 -18  -9  28  42

[20 rows x 4 columns]

mean 歸一化來歸納 Pandas DataFrame

“均值 “歸一化是對不同範圍的 DataFrame 進行歸一化的最簡單方法之一。歸一化是通過減去 DataFrame 所有元素的平均值併除以標準差來完成的。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))


def mean_norm(df_input):
    return df_input.apply(lambda x: (x - x.mean()) / x.std(), axis=0)


df_mean_norm = mean_norm(df)
print(df_mean_norm)

輸出:

           A         B         C         D
0   1.452954 -1.090261  0.278088  1.247208
1  -0.514295  1.585670  0.037765 -1.333223
2  -1.376137 -1.289148 -0.236890 -0.473079
3  -0.120845  0.591236 -0.734701  1.261309
4  -1.038895 -0.367037  1.256545 -0.219266
5  -0.251995  1.043252 -1.301176 -0.374374
6  -0.420617 -1.777325  0.810231  0.161453
7   1.921346 -0.511681  1.273711  1.247208
8  -0.233260 -0.150069  1.308043 -1.051208
9   0.984561  0.717801  0.707236  0.894690
10 -1.170045  1.549509 -1.575831  1.148503
11  0.609847 -1.361470 -1.198181  0.669079
12  1.284333  0.121140  1.411038 -1.065309
13 -1.132573  0.374269  0.466913  0.852388
14 -0.776595  0.464672 -1.078020 -1.220417
15 -0.289467  0.446591  0.072097 -0.867899
16  1.715254 -1.379551  0.329586 -1.446028
17 -0.551766  1.115574 -0.751867 -0.966604
18  0.141455  0.211543 -1.541499  0.993395
19 -0.233260 -0.294714  0.466913  0.542172

如果你使用的是 Jupyter 筆記本,可以使用 Matplotlib 對兩個 DataFrame 進行視覺化,如下圖所示。

# %matplotlib inline
df["A"].plot(kind="bar")

通過選擇歸一化前的 DataFrame 的 A 列,並將其視覺化為一個條形圖,注意到 y 軸包含-100 到 100 的範圍內的值。

平均值歸一化 - 歸一化前

# %matplotlib inline
df_mean_norm["A"].plot(kind="bar")

下圖顯示了歸一化後的資料;當同一列視覺化時,y 軸位於-1.5 至+1.5 的範圍內。

平均歸一化 - 歸一化後

最小-最大 歸一化方法對 Pandas DataFrame 進行歸一化

這是廣泛使用的歸一化方法之一。歸一化輸出減去 DataFrame 的最小值,然後除以相應列的最高值和最低值之差。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))


def minmax_norm(df_input):
    return (df - df.min()) / (df.max() - df.min())


df_minmax_norm = minmax_norm(df)

print(df_minmax_norm)

輸出:

           A         B         C         D
0   0.857955  0.204301  0.620690  0.994792
1   0.261364  1.000000  0.540230  0.041667
2   0.000000  0.145161  0.448276  0.359375
3   0.380682  0.704301  0.281609  1.000000
4   0.102273  0.419355  0.948276  0.453125
5   0.340909  0.838710  0.091954  0.395833
6   0.289773  0.000000  0.798851  0.593750
7   1.000000  0.376344  0.954023  0.994792
8   0.346591  0.483871  0.965517  0.145833
9   0.715909  0.741935  0.764368  0.864583
10  0.062500  0.989247  0.000000  0.958333
11  0.602273  0.123656  0.126437  0.781250
12  0.806818  0.564516  1.000000  0.140625
13  0.073864  0.639785  0.683908  0.848958
14  0.181818  0.666667  0.166667  0.083333
15  0.329545  0.661290  0.551724  0.213542
16  0.937500  0.118280  0.637931  0.000000
17  0.250000  0.860215  0.275862  0.177083
18  0.460227  0.591398  0.011494  0.901042
19  0.346591  0.440860  0.683908  0.734375

在上面的輸出中,我們可以推斷出每一列的最小值被轉化為 0,每一列的最大值被轉化為 1

歸一化後的列 A 是視覺化的,如下圖所示。

# %matplotlib inline
df_minmax_norm["A"].plot(kind="bar")

最小-最大歸一化 - 歸一化後

雖然這對近距離的 DataFrame 很有好處,但 MinMax 歸一化可能不適合有許多異常值的 DataFrame。

使用 分位數 歸一化對 Pandas DataFrame 進行歸一化

量子化歸一化用於高維資料分析。它觀察並假設每一列的統計分佈是相同的。分位數歸一化包括以下步驟。

  1. 對每列內的數值進行排序(Ranking); 2。
  2. 每行的平均值,用平均值代替行中每個元素的值。
  3. 將數值重新排序到最初的順序。
import numpy as np
import pandas as pd

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))


def quantile_norm(df_input):
    sorted_df = pd.DataFrame(
        np.sort(df_input.values, axis=0), index=df_input.index, columns=df_input.columns
    )
    mean_df = sorted_df.mean(axis=1)
    mean_df.index = np.arange(1, len(mean_df) + 1)
    quantile_df = df_input.rank(method="min").stack().astype(int).map(mean_df).unstack()
    return quantile_df


df_quantile_norm = quantile_norm(df)

print(df_quantile_norm)

4.輸出。

        A      B      C      D
0   77.00 -58.25   8.25  77.00
1  -36.50  92.00 -10.50 -79.25
2  -90.00 -66.50 -20.00 -20.00
3   24.75  44.00 -36.50  92.00
4  -66.50 -36.50  71.75  -3.00
5   -3.00  71.75 -73.00 -10.50
6  -20.00 -90.00  54.00   8.25
7   92.00 -41.00  77.00  77.00
8    8.25 -10.50  87.00 -58.25
9   54.00  54.00  44.00  44.00
10 -79.25  87.00 -90.00  71.75
11  44.00 -73.00 -66.50  24.75
12  71.75  -3.00  92.00 -66.50
13 -73.00  18.00  24.75  31.75
14 -58.25  31.75 -58.25 -73.00
15 -10.50  24.75  -3.00 -36.50
16  87.00 -79.25  18.00 -90.00
17 -41.00  77.00 -41.00 -41.00
18  31.75   8.25 -79.25  54.00
19   8.25 -20.00  24.75  18.00

量子化歸一化的輸出可以直觀地顯示在 A 列上,如下圖所示。

分位數歸一化 - 歸一化後

相關文章 - Pandas DataFrame

相關文章 - Pandas DataFrame Column