规范化我数据集中的所有数字列并比较前后

Normalizing all numeric columns in my dataset and compare before and after

我想标准化数据集中的所有数值。

我已将整个数据集放入 pandas 数据框。

到目前为止我的代码是:

for column in numeric:     #numeric=df._get_numeric_data()

        x_array=np.array(df[column])
        normalized_X=preprocessing.normalize([x_array])

但是我如何验证这是正确的呢? 我尝试在规范化之前和在 for 循环之前和之后添加这段代码之后为其中一列绘制直方图:

x=df['Below.Primary']      #Below.Primary is one of my column names
plt.hist(x, bins=45)

蓝色柱状图在 for 循环之前,橙色柱状图在之后。 我的总代码如下所示:

ln[21]  plt.hist(df['Below.Primary'], bins=45)

ln[22]  for column in numeric:
             x_array=np.array(df[column])
             normalized_X=preprocessing.normalize([x_array])

        x=df['Below.Primary']
        plt.hist(x, bins=45)

我没有看到任何规模缩小。我做错了什么?如果不正确,有人可以指出做我想做的事情的正确方法吗?

试试这个:

scaler = preprocessing.StandardScaler()
df[col] = scaler.fit_transform(df[col])  

您必须在迭代时将 normalized_X 设置为相应的列。

for column in numeric:
         x_array=np.array(df[column])
         normalized_X=preprocessing.normalize([x_array])
         df[column]= normalized_X #Setting normalized value in the column

    x=df['Below.Primary']
    plt.hist(x, bins=45)

先说几个一般的事情。

  • 如果 numeric 是列名列表(看起来是这种情况),则不需要 for 循环。
  • A Pandas 系列在幕后使用 ndarray,因此您只需使用 Series.values 请求 ndarray 而不是调用 np.array()See this page on the Pandas Series.
  • 我假设您正在使用 preprocessing from sklearn

为此我建议使用 sklearn.preprocessing.Normalizer。

import pandas as pd
from sklearn.preprocessing import Normalizer

### Without the for loop (recommended)
# this version returns array

normalizer = Normalizer()
normalized_values = normalizer.fit_transform(df[numeric])

# normalized_values is a 2D array which is useful
# for many applications
# to convert back to DataFrame

df = pd.DataFrame(normalized_values, columns = numeric)


### with the for-loop (not recommended)

for column in numeric:
    x_array = df[column].values.reshape(-1,1)
    df[column] = normalizer.fit_transform(x_array)