Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带条件的熊猫级数的正规化_Python_Pandas_Dataframe_Normalization - Fatal编程技术网

Python 带条件的熊猫级数的正规化

Python 带条件的熊猫级数的正规化,python,pandas,dataframe,normalization,Python,Pandas,Dataframe,Normalization,我正在使用具有以下结构的数据帧学习Python/Pandas: 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]

我正在使用具有以下结构的数据帧学习Python/Pandas:

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
    ,则返回缺少的
    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

第二个选项的值的范围就是我要寻找的。我唯一的问题是,这覆盖了我想保留它们的原始系列,并且有我在帖子中提到的单独的标准化分数。