我在pandas中有一个数据框,其中每列具有不同的值范围 . 例如:
DF:
A B C 1000 10 0.5 765 5 0.35 800 7 0.09
知道如何规范化这个数据帧的列,其中每个值介于0和1之间?
我想要的输出是:
A B C 1 1 1 0.765 0.5 0.7 0.8 0.7 0.18(which is 0.09/0.5)
You can create a list of columns that you want to normalize
column_names_to_normalize = ['A', 'E', 'G', 'sadasdsd', 'lol'] x = df[column_names_to_normalize].values x_scaled = min_max_scaler.fit_transform(x) df_temp = pd.DataFrame(x_scaled, columns=column_names_to_normalize, index = df.index) df[column_names_to_normalize] = df_temp
Your Pandas Dataframe is now normalized only at the columns you want
However ,如果你想要 opposite ,选择你想要规范化的列列表,你可以简单地创建所有列的列表并删除那些不需要的列
column_names_to_not_normalize = ['B', 'J', 'K'] column_names_to_normalize = [x for x in list(df) if x not in column_names_to_not_normalize ]
您可以使用包sklearn及其关联的预处理实用程序来规范化数据 .
from sklearn import preprocessing x = df.values #returns a numpy array min_max_scaler = preprocessing.MinMaxScaler() x_scaled = min_max_scaler.fit_transform(x) df = pandas.DataFrame(x_scaled)
有关更多信息,请查看有关预处理数据的scikit-learn documentation:将功能扩展到范围 .
一个简单的方法,使用 Pandas :(这里我想使用均值归一化)
normalized_df=(df-df.mean())/df.std()
使用min-max规范化:
normalized_df=(df-df.min())/(df.max()-df.min())
根据这篇文章:https://stats.stackexchange.com/questions/70801/how-to-normalize-data-to-0-1-range
您可以执行以下操作:
def normalize(df): result = df.copy() for feature_name in df.columns: max_value = df[feature_name].max() min_value = df[feature_name].min() result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value) return result
您无需担心自己的 Value 观是消极的还是积极的 . 并且值应该很好地分布在0和1之间 .
如果您喜欢使用sklearn包,可以使用pandas loc 来保留列名和索引名,如下所示:
loc
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() scaled_values = scaler.fit_transform(df) df.loc[:,:] = scaled_values
你的问题实际上是一个简单的变换作用于列:
def f(s): return s/s.max() frame.apply(f, axis=0)
或者更简洁:
frame.apply(lambda x: x/x.max(), axis=0)
简单即美:
df["A"] = df["A"] / df["A"].max() df["B"] = df["B"] / df["B"].max() df["C"] = df["C"] / df["C"].max()
我认为在熊猫中做到这一点的更好方法就是
df = df/df.max().astype(np.float64)
Edit 如果您的数据框中存在负数,则应使用
df = df/df.loc[df.abs().idxmax()].astype(np.float64)
桑德曼和普拉文给出的解决方案非常好 . 唯一的问题是,如果您在数据框的其他列中有分类变量,则此方法需要进行一些调整 .
我对此类问题的解决方案如下:
from sklearn import preprocesing x = pd.concat([df.Numerical1, df.Numerical2,df.Numerical3]) min_max_scaler = preprocessing.MinMaxScaler() x_scaled = min_max_scaler.fit_transform(x) x_new = pd.DataFrame(x_scaled) df = pd.concat([df.Categoricals,x_new])
def normalize(x): try: x = x/np.linalg.norm(x,ord=1) return x except : raise data = pd.DataFrame.apply(data,normalize)
从pandas的文档中,DataFrame结构可以将操作(函数)应用于自身 .
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
沿DataFrame的输入轴应用功能 . 传递给函数的对象是具有索引的系列对象,索引是DataFrame的索引(轴= 0)或列(轴= 1) . 返回类型取决于是否传递函数聚合,如果DataFrame为空,则取决于reduce参数 .
您可以应用自定义函数来操作DataFrame .
10 回答
You can create a list of columns that you want to normalize
Your Pandas Dataframe is now normalized only at the columns you want
However ,如果你想要 opposite ,选择你想要规范化的列列表,你可以简单地创建所有列的列表并删除那些不需要的列
您可以使用包sklearn及其关联的预处理实用程序来规范化数据 .
有关更多信息,请查看有关预处理数据的scikit-learn documentation:将功能扩展到范围 .
一个简单的方法,使用 Pandas :(这里我想使用均值归一化)
使用min-max规范化:
根据这篇文章:https://stats.stackexchange.com/questions/70801/how-to-normalize-data-to-0-1-range
您可以执行以下操作:
您无需担心自己的 Value 观是消极的还是积极的 . 并且值应该很好地分布在0和1之间 .
如果您喜欢使用sklearn包,可以使用pandas
loc
来保留列名和索引名,如下所示:你的问题实际上是一个简单的变换作用于列:
或者更简洁:
简单即美:
我认为在熊猫中做到这一点的更好方法就是
Edit 如果您的数据框中存在负数,则应使用
桑德曼和普拉文给出的解决方案非常好 . 唯一的问题是,如果您在数据框的其他列中有分类变量,则此方法需要进行一些调整 .
我对此类问题的解决方案如下:
从pandas的文档中,DataFrame结构可以将操作(函数)应用于自身 .
您可以应用自定义函数来操作DataFrame .