如何规范化 pandas 数据框中一系列列中的数据
How can I normalize the data in a range of columns in my pandas dataframe
假设我有一个 pandas 数据框 surveyData:
我想通过执行以下操作来规范化每列中的数据:
surveyData_norm = (surveyData - surveyData.mean()) / (surveyData.max() - surveyData.min())
如果我的数据 table 只包含我想规范化的列,这会很好用。但是,我有一些包含字符串数据的列,例如:
Name State Gender Age Income Height
Sam CA M 13 10000 70
Bob AZ M 21 25000 55
Tom FL M 30 100000 45
我只想规范化年龄、收入和身高列,但我的上述方法不起作用,因为名称状态和性别列中的字符串数据。
您可以通过多种方式对 pandas 中的行或列子集执行操作。一种有用的方法是索引:
# Assuming same lines from your example
cols_to_norm = ['Age','Height']
survey_data[cols_to_norm] = survey_data[cols_to_norm].apply(lambda x: (x - x.min()) / (x.max() - x.min()))
这将仅将其应用于您需要的列并将结果分配回这些列。或者,您可以将它们设置为新的规范化列,并根据需要保留原始列。
简单的方法和更有效的方法:
预先计算平均值:
dropna()
避免丢失数据。
mean_age = survey_data.Age.dropna().mean()
max_age = survey_data.Age.dropna().max()
min_age = survey_data.Age.dropna().min()
dataframe['Age'] = dataframe['Age'].apply(lambda x: (x - mean_age ) / (max_age -min_age ))
这种方法行得通...
我认为在这种情况下使用 'sklearn.preprocessing' 更好,这可以为我们提供更多缩放选项。
在您使用 StandardScaler 的情况下,这样做的方法是:
from sklearn.preprocessing import StandardScaler
cols_to_norm = ['Age','Height']
surveyData[cols_to_norm] = StandardScaler().fit_transform(surveyData[cols_to_norm])
import pandas as pd
import numpy as np
# let Dataset here be your data#
from sklearn.preprocessing import MinMaxScaler
minmax = MinMaxScaler()
for x in dataset.columns[dataset.dtypes == 'int64']:
Dataset[x] = minmax.fit_transform(np.array(Dataset[I]).reshape(-1,1))
我觉得使用built-in函数真的很好
# Assuming same lines from your example
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
cols_to_norm = ['Age','Height']
survey_data[cols_to_norm] = scaler.fit_transform(survey_data[cols_to_norm])
MinMax 使用 minmax_scale
规范化所有数字列
import numpy as np
from sklearn.preprocessing import minmax_scale
# cols = ['Age', 'Height']
cols = df.select_dtypes(np.number).columns
df[cols] = minmax_scale(df[cols])
注意:保持索引、列名或 non-numerical 变量不变。
假设我有一个 pandas 数据框 surveyData:
我想通过执行以下操作来规范化每列中的数据:
surveyData_norm = (surveyData - surveyData.mean()) / (surveyData.max() - surveyData.min())
如果我的数据 table 只包含我想规范化的列,这会很好用。但是,我有一些包含字符串数据的列,例如:
Name State Gender Age Income Height
Sam CA M 13 10000 70
Bob AZ M 21 25000 55
Tom FL M 30 100000 45
我只想规范化年龄、收入和身高列,但我的上述方法不起作用,因为名称状态和性别列中的字符串数据。
您可以通过多种方式对 pandas 中的行或列子集执行操作。一种有用的方法是索引:
# Assuming same lines from your example
cols_to_norm = ['Age','Height']
survey_data[cols_to_norm] = survey_data[cols_to_norm].apply(lambda x: (x - x.min()) / (x.max() - x.min()))
这将仅将其应用于您需要的列并将结果分配回这些列。或者,您可以将它们设置为新的规范化列,并根据需要保留原始列。
简单的方法和更有效的方法:
预先计算平均值:
dropna()
避免丢失数据。
mean_age = survey_data.Age.dropna().mean()
max_age = survey_data.Age.dropna().max()
min_age = survey_data.Age.dropna().min()
dataframe['Age'] = dataframe['Age'].apply(lambda x: (x - mean_age ) / (max_age -min_age ))
这种方法行得通...
我认为在这种情况下使用 'sklearn.preprocessing' 更好,这可以为我们提供更多缩放选项。 在您使用 StandardScaler 的情况下,这样做的方法是:
from sklearn.preprocessing import StandardScaler
cols_to_norm = ['Age','Height']
surveyData[cols_to_norm] = StandardScaler().fit_transform(surveyData[cols_to_norm])
import pandas as pd
import numpy as np
# let Dataset here be your data#
from sklearn.preprocessing import MinMaxScaler
minmax = MinMaxScaler()
for x in dataset.columns[dataset.dtypes == 'int64']:
Dataset[x] = minmax.fit_transform(np.array(Dataset[I]).reshape(-1,1))
我觉得使用built-in函数真的很好
# Assuming same lines from your example
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
cols_to_norm = ['Age','Height']
survey_data[cols_to_norm] = scaler.fit_transform(survey_data[cols_to_norm])
MinMax 使用 minmax_scale
import numpy as np
from sklearn.preprocessing import minmax_scale
# cols = ['Age', 'Height']
cols = df.select_dtypes(np.number).columns
df[cols] = minmax_scale(df[cols])
注意:保持索引、列名或 non-numerical 变量不变。