我有一个熊猫的数据框架,其中每一列都有不同的值范围。例如:

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)

当前回答

如果你喜欢使用sklearn包,你可以像这样使用pandas loc来保持列名和索引名:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler() 
scaled_values = scaler.fit_transform(df) 
df.loc[:,:] = scaled_values

其他回答

正常化

您可以使用minmax_scale将每一列转换为从0到1的刻度。

from sklearn.preprocessing import minmax_scale
df[:] = minmax_scale(df)

标准化

您可以使用比例将每列居中到平均值,并缩放到单位方差。

from sklearn.preprocessing import scale
df[:] = scale(df)

列的子集

归一化单列

from sklearn.preprocessing import minmax_scale
df['a'] = minmax_scale(df['a'])

只归一化数值列

import numpy as np
from sklearn.preprocessing import minmax_scale
cols = df.select_dtypes(np.number).columns
df[cols] = minmax_scale(df[cols])

完整的示例

# Prep
import pandas as pd
import numpy as np
from sklearn.preprocessing import minmax_scale

# Sample data
df = pd.DataFrame({'a':[0,1,2], 'b':[-10,-30,-50], 'c':['x', 'y', 'z']})

# MinMax normalize all numeric columns
cols = df.select_dtypes(np.number).columns
df[cols] = minmax_scale(df[cols])

# Result
print(df)

#    a    b  c
# 0  0.0  1.0  x
# 2  0.5  0.5  y
# 3  1.0  0.0  z

注:

在所有示例中,可以使用scale来代替minmax_scale。保持索引、列名或非数值变量不变。函数应用于每一列。

警告:

对于机器学习,可以使用minmax_scale或train_test_split后的scale来避免数据泄露。

Info

更多关于标准化和规范化的信息:

https://machinelearningmastery.com/standardscaler-and-minmaxscaler-transforms-in-python/ https://en.wikipedia.org/wiki/Normalization_(统计) https://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing

要规范化一个DataFrame列,只使用本机Python。

不同的值会影响过程,例如图的颜色。

0到1之间:

min_val = min(list(df['col']))
max_val = max(list(df['col']))
df['col'] = [(x - min_val) / max_val for x in df['col']]

-1 ~ 1:

df['col'] = [float(i)/sum(df['col']) for i in df['col']]

OR

df['col'] = [float(tp) / max(abs(df['col'])) for tp in df['col']]

使用Pandas的一个简单方法:(这里我想使用均值归一化)

normalized_df=(df-df.mean())/df.std()

使用最小-最大归一化:

normalized_df=(df-df.min())/(df.max()-df.min())

编辑:为了解决一些问题,需要说明Pandas在上面的代码中自动应用列函数。

这只是简单的数学。答案应该如下所示。

normed_df = (df - df.min()) / (df.max() - df.min())

你的问题实际上是一个作用于列的简单变换:

def f(s):
    return s/s.max()

frame.apply(f, axis=0)

或者更简洁:

   frame.apply(lambda x: x/x.max(), axis=0)