Python Dataframe:使用lambda规范化数值列

时间:2016-04-03 15:20:02

标签: python lambda dataframe

我尝试使用以下代码来规范化python数据框中的列:

df['x_norm'] = df.apply(lambda x: (x['X'] - x['X'].mean()) / (x['X'].max() - x['X'].min()),axis=1)

但出现以下错误:

    df['x_norm'] = df.apply(lambda x: (x['X'] - x['X'].mean()) / (x['X'].max() - x['X'].min()),axis=1)
AttributeError: ("'float' object has no attribute 'mean'", u'occurred at index 0')

有谁知道我在这里错过了什么?谢谢!

2 个答案:

答案 0 :(得分:1)

我假设你正在使用 Pandas

您应该预先计算平均值,最大值和最小值,而不是将整个数据帧应用于(Documentation)仅应用于系列'X'。像这样:

avg = df['X'].mean()
diff = df['X'].max() - df['X'].min()
new_df = df['X'].apply(lambda x: (x-avg)/diff) 

如果您希望规范化整个DataFrame,请检查此answer

df.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))

答案 1 :(得分:0)

如果要标准化X列中的值:

df['x_norm'] = df.X.div(df.X.sum())

一步一步:

In [65]: df
Out[65]:
   a  b  X
0  2  1  5
1  1  4  5
2  7  4  7
3  1  6  6
4  5  5  8
5  5  8  2
6  6  7  5
7  8  2  5
8  7  9  9
9  9  6  5

In [68]: df['x_norm'] = df.X.div(df.X.sum())

In [69]: df
Out[69]:
   a  b  X    x_norm
0  2  1  5  0.087719
1  1  4  5  0.087719
2  7  4  7  0.122807
3  1  6  6  0.105263
4  5  5  8  0.140351
5  5  8  2  0.035088
6  6  7  5  0.087719
7  8  2  5  0.087719
8  7  9  9  0.157895
9  9  6  5  0.087719

检查:

In [70]: df.x_norm.sum()
Out[70]: 1.0