我有一个熊猫的数据框架,其中每一列都有不同的值范围。例如:
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)
当前回答
要规范化一个DataFrame列,只使用本机Python。
不同的值会影响过程,例如图的颜色。
0到1之间:
min_val = min(list(df['col']))
max_val = max(list(df['col']))
df['col'] = [(x - min_val) / max_val for x in df['col']]
-1 ~ 1:
df['col'] = [float(i)/sum(df['col']) for i in df['col']]
OR
df['col'] = [float(tp) / max(abs(df['col'])) for tp in df['col']]
其他回答
您可以创建要规范化的列的列表
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 ]
下面的函数计算Z分数:
def standardization(dataset):
""" Standardization of numeric fields, where all values will have mean of zero
and standard deviation of one. (z-score)
Args:
dataset: A `Pandas.Dataframe`
"""
dtypes = list(zip(dataset.dtypes.index, map(str, dataset.dtypes)))
# Normalize numeric columns.
for column, dtype in dtypes:
if dtype == 'float32':
dataset[column] -= dataset[column].mean()
dataset[column] /= dataset[column].std()
return dataset
Pandas默认情况下按列进行归一化。试试下面的代码。
X= pd.read_csv('.\\data.csv')
X = (X-X.min())/(X.max()-X.min())
输出值将在0和1的范围内。
你的问题实际上是一个作用于列的简单变换:
def f(s):
return s/s.max()
frame.apply(f, axis=0)
或者更简洁:
frame.apply(lambda x: x/x.max(), axis=0)
注意这个答案,因为它只适用于范围为[0,n]的数据。这对任何范围的数据都不起作用。
简单就是美:
df["A"] = df["A"] / df["A"].max()
df["B"] = df["B"] / df["B"].max()
df["C"] = df["C"] / df["C"].max()