我有一个熊猫的数据框架,其中每一列都有不同的值范围。例如:
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)
我有一个熊猫的数据框架,其中每一列都有不同的值范围。例如:
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)
当前回答
我认为在熊猫身上更好的方法是
df = df/df.max().astype(np.float64)
如果在你的数据帧中出现负数,你应该用负数代替
df = df/df.loc[df.abs().idxmax()].astype(np.float64)
其他回答
您可以使用sklearn包及其相关的预处理实用程序来规范化数据。
import pandas as pd
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 = pd.DataFrame(x_scaled)
有关更多信息,请参阅scikit-learn关于预处理数据的文档:将特性扩展到一个范围。
这只是简单的数学。答案应该如下所示。
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)
如果你的数据是正倾斜的,最好的归一化方法是使用对数变换:
df = np.log10(df)
如果你喜欢使用sklearn包,你可以像这样使用pandas loc来保持列名和索引名:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaled_values = scaler.fit_transform(df)
df.loc[:,:] = scaled_values