我有一个熊猫的数据框架,其中每一列都有不同的值范围。例如:
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[col].update((df[col] - df[col].min()) / (df[col].max() - df[col].min())) for col in df.columns]
其他回答
你可以在一行中完成
DF_test = DF_test.sub(DF_test.mean(axis=0), axis=1)/DF_test.mean(axis=0)
它取每一列的平均值,然后从每一行中减去它(平均值)(特定列的平均值仅从该行中减去),然后仅除以平均值。最后,我们得到的是规范化的数据集。
这是你如何使用列表推导式来做的:
[df[col].update((df[col] - df[col].min()) / (df[col].max() - df[col].min())) for col in df.columns]
您可以创建要规范化的列的列表
column_names_to_normalize = ['A', 'E', 'G', 'sadasdsd', 'lol']
x = df[column_names_to_normalize].values
x_scaled = min_max_scaler.fit_transform(x)
df_temp = pd.DataFrame(x_scaled, columns=column_names_to_normalize, index = df.index)
df[column_names_to_normalize] = df_temp
你的Pandas数据帧现在只在你想要的列上被标准化了
然而,如果你想要相反的结果,选择一个你不想规范化的列列表,你可以简单地创建一个所有列的列表,并删除那些不需要的列
column_names_to_not_normalize = ['B', 'J', 'K']
column_names_to_normalize = [x for x in list(df) if x not in column_names_to_not_normalize ]
注意这个答案,因为它只适用于范围为[0,n]的数据。这对任何范围的数据都不起作用。
简单就是美:
df["A"] = df["A"] / df["A"].max()
df["B"] = df["B"] / df["B"].max()
df["C"] = df["C"] / df["C"].max()
我认为在熊猫身上更好的方法是
df = df/df.max().astype(np.float64)
如果在你的数据帧中出现负数,你应该用负数代替
df = df/df.loc[df.abs().idxmax()].astype(np.float64)