规范化我数据集中的所有数字列并比较前后
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)
我想标准化数据集中的所有数值。
我已将整个数据集放入 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)