归一化 Pandas 有条件的序列
Normalizing Pandas Series with condition
我正在学习 Python/Pandas 使用具有以下结构的 DataFrame:
import pandas as pd
df = pd.DataFrame({'key' : [111, 222, 333, 444, 555, 666, 777, 888, 999],
'score1' : [-1, 0, 2, -1, 7, 0, 15, 0, 1],
'score2' : [2, 2, -1, 10, 0, 5, -1, 1, 0]})
print(df)
key score1 score2
0 111 -1 2
1 222 0 2
2 333 2 -1
3 444 -1 10
4 555 7 0
5 666 0 5
6 777 15 -1
7 888 0 1
8 999 1 0
score1
和 score2
系列的可能值为 -1
和所有正整数(包括 0
)。
我的目标 是按以下方式规范化两列:
- 如果值等于
-1
,则 return 缺少 NaN
值
- 否则,在
0
和 1
之间的范围内标准化剩余的正整数。
我不想覆盖原来的系列 score1
和 score2
。相反,我想在两个系列上应用一个函数来创建两个新列(比如 norm1
和 norm2
)。
我在这里阅读了几篇文章,建议使用 sklearn 预处理模块中的 MinMaxScaler()
方法。我不认为这是我需要的,因为我需要一个额外的条件来处理 -1
值。
我认为我需要的是我可以在两个系列上应用的特定功能。我也熟悉了规范化的工作原理,但在 Python 中实现此功能时遇到困难。任何额外的帮助将不胜感激。
想法是将 -1
个值转换为缺失值:
cols = ['score1','score2']
df[cols] = df[cols].mask(df[cols] == -1)
x = df[cols].values
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = df.join(pd.DataFrame(x_scaled, columns=cols).add_prefix('norm_'))
print (df)
key score1 score2 norm_score1 norm_score2
0 111 NaN 2.0 NaN 0.2
1 222 0.0 2.0 0.000000 0.2
2 333 2.0 NaN 0.133333 NaN
3 444 NaN 10.0 NaN 1.0
4 555 7.0 0.0 0.466667 0.0
5 666 0.0 5.0 0.000000 0.5
6 777 15.0 NaN 1.000000 NaN
7 888 0.0 1.0 0.000000 0.1
8 999 1.0 0.0 0.066667 0.0
我正在学习 Python/Pandas 使用具有以下结构的 DataFrame:
import pandas as pd
df = pd.DataFrame({'key' : [111, 222, 333, 444, 555, 666, 777, 888, 999],
'score1' : [-1, 0, 2, -1, 7, 0, 15, 0, 1],
'score2' : [2, 2, -1, 10, 0, 5, -1, 1, 0]})
print(df)
key score1 score2
0 111 -1 2
1 222 0 2
2 333 2 -1
3 444 -1 10
4 555 7 0
5 666 0 5
6 777 15 -1
7 888 0 1
8 999 1 0
score1
和 score2
系列的可能值为 -1
和所有正整数(包括 0
)。
我的目标 是按以下方式规范化两列:
- 如果值等于
-1
,则 return 缺少NaN
值 - 否则,在
0
和1
之间的范围内标准化剩余的正整数。
我不想覆盖原来的系列 score1
和 score2
。相反,我想在两个系列上应用一个函数来创建两个新列(比如 norm1
和 norm2
)。
我在这里阅读了几篇文章,建议使用 sklearn 预处理模块中的 MinMaxScaler()
方法。我不认为这是我需要的,因为我需要一个额外的条件来处理 -1
值。
我认为我需要的是我可以在两个系列上应用的特定功能。我也熟悉了规范化的工作原理,但在 Python 中实现此功能时遇到困难。任何额外的帮助将不胜感激。
想法是将 -1
个值转换为缺失值:
cols = ['score1','score2']
df[cols] = df[cols].mask(df[cols] == -1)
x = df[cols].values
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = df.join(pd.DataFrame(x_scaled, columns=cols).add_prefix('norm_'))
print (df)
key score1 score2 norm_score1 norm_score2
0 111 NaN 2.0 NaN 0.2
1 222 0.0 2.0 0.000000 0.2
2 333 2.0 NaN 0.133333 NaN
3 444 NaN 10.0 NaN 1.0
4 555 7.0 0.0 0.466667 0.0
5 666 0.0 5.0 0.000000 0.5
6 777 15.0 NaN 1.000000 NaN
7 888 0.0 1.0 0.000000 0.1
8 999 1.0 0.0 0.066667 0.0