规范化pandas中的数据

jas*_*son 126 python numpy pandas

假设我有一个pandas数据框df:

我想计算数据框的列方式.

这很简单:

df.apply(average) 
Run Code Online (Sandbox Code Playgroud)

然后列方式范围max(col) - min(col).这很容易再次:

df.apply(max) - df.apply(min)
Run Code Online (Sandbox Code Playgroud)

现在对于每个元素,我想减去其列的平均值并除以其列的范围.我不知道该怎么做

任何帮助/指针都非常感谢.

Wou*_*ire 217

In [92]: df
Out[92]:
           a         b          c         d
A  -0.488816  0.863769   4.325608 -4.721202
B -11.937097  2.993993 -12.916784 -1.086236
C  -5.569493  4.672679  -2.168464 -9.315900
D   8.892368  0.932785   4.535396  0.598124

In [93]: df_norm = (df - df.mean()) / (df.max() - df.min())

In [94]: df_norm
Out[94]:
          a         b         c         d
A  0.085789 -0.394348  0.337016 -0.109935
B -0.463830  0.164926 -0.650963  0.256714
C -0.158129  0.605652 -0.035090 -0.573389
D  0.536170 -0.376229  0.349037  0.426611

In [95]: df_norm.mean()
Out[95]:
a   -2.081668e-17
b    4.857226e-17
c    1.734723e-17
d   -1.040834e-17

In [96]: df_norm.max() - df_norm.min()
Out[96]:
a    1
b    1
c    1
d    1
Run Code Online (Sandbox Code Playgroud)

  • 这是显而易见的,我的头脑不能接受它:) (25认同)
  • 如果您需要值> 0:df_norm =(df - df.min())/(df.max() - df.min()) (15认同)
  • 第一个括号中应该是 df_norm = (df - df.min()) / (df.max() - df.min()) 而不是 df.mean() 以获得 0 和 1 之间的值 (2认同)
  • 如果您的数据框的某些列中包含字符串,请参见此[answer](/sf/ask/3124760971/) (2认同)

Dav*_* S. 69

如果您不介意导入sklearn库,我会推荐在博客上讨论的方法.

import pandas as pd
from sklearn import preprocessing

data = {'score': [234,24,14,27,-74,46,73,-18,59,160]}
cols = data.columns
df = pd.DataFrame(data)
df

min_max_scaler = preprocessing.MinMaxScaler()
np_scaled = min_max_scaler.fit_transform(df)
df_normalized = pd.DataFrame(np_scaled, columns = cols)
df_normalized
Run Code Online (Sandbox Code Playgroud)

  • 创建单位正态标准化数据的相应方法称为StandardScaler. (3认同)
  • 博客帖子的链接已经死了.你有工作吗? (2认同)

nau*_*101 32

你可以使用apply它,它有点整洁:

import numpy as np
import pandas as pd

np.random.seed(1)

df = pd.DataFrame(np.random.randn(4,4)* 4 + 3)

          0         1         2         3
0  9.497381  0.552974  0.887313 -1.291874
1  6.461631 -6.206155  9.979247 -0.044828
2  4.276156  2.002518  8.848432 -5.240563
3  1.710331  1.463783  7.535078 -1.399565

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

          0         1         2         3
0  0.515087  0.133967 -0.651699  0.135175
1  0.125241 -0.689446  0.348301  0.375188
2 -0.155414  0.310554  0.223925 -0.624812
3 -0.484913  0.244924  0.079473  0.114448
Run Code Online (Sandbox Code Playgroud)

此外,groupby如果您选择相关列,它可以很好地工作:

df['grp'] = ['A', 'A', 'B', 'B']

          0         1         2         3 grp
0  9.497381  0.552974  0.887313 -1.291874   A
1  6.461631 -6.206155  9.979247 -0.044828   A
2  4.276156  2.002518  8.848432 -5.240563   B
3  1.710331  1.463783  7.535078 -1.399565   B


df.groupby(['grp'])[[0,1,2,3]].apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))

     0    1    2    3
0  0.5  0.5 -0.5 -0.5
1 -0.5 -0.5  0.5  0.5
2  0.5  0.5  0.5 -0.5
3 -0.5 -0.5 -0.5  0.5
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

214138 次

最近记录:

6 年,4 月 前