使用for循环缩放列

时间:2018-08-21 12:47:23

标签: python pandas

我想用一个函数缩放数据框的一列的所有值。这是到目前为止的功能:

def scale0_1(cname):
     temp = array(cname)
     for i in range(len(temp)):
         value = temp[i]-min(temp)/(max(temp)-min(temp))
         temp[i] = value
     return pd.DataFrame(temp)

这是示例列,用于通过以下方式测试功能:

samplecolumn = pd.DataFrame([7.0, 15.8, 19.4, 11.4])

但是,当我将该函数与数据框的某列一起使用(任何数字列都可以使用)时,它只会返回原始值,而不执行任何操作。没有错误信息。有谁知道如何解决这个问题?

我将非常感谢您的帮助:)

3 个答案:

答案 0 :(得分:3)

使用np.interp

a=df[0].values

np.interp(a, (a.min(), a.max()), (0, +1))
Out[36]: array([0.        , 0.70967742, 1.        , 0.35483871])

答案 1 :(得分:2)

使用pandas数据框,您可以将操作应用于整个列。这使您可以执行以下操作:

def scale0_1(cname):
    scale_factor = min(cname) / (max(cname) - min(cname))
    return cname - scale_factor

这还使您可以通过整个操作将数据保留在pandas Series或DataFrame中,并且避免了将数据转换为数组并返回的复杂性。

答案 2 :(得分:2)

在可能的情况下,应该使用向量化方法,而不是显式地迭代行。例如,您可以计算列的最大值和最小值。然后,在执行序列运算时,将自动对计算进行矢量化。

df = pd.DataFrame({'A': [7.0, 15.8, 19.4, 11.4]})

col_min = df['A'].min()
col_max = df['A'].max()

df['B'] = (df['A'] - col_min) / (col_max - col_min)

这是一项常见的任务,因此您会发现它存在于其他第三方库中。例如,使用sklearn

from sklearn import preprocessing

min_max_scaler = preprocessing.MinMaxScaler()
df['B'] = min_max_scaler.fit_transform(df['A'])

结果

print(df)

      A         B
0   7.0  0.000000
1  15.8  0.709677
2  19.4  1.000000
3  11.4  0.354839