python - 用条件标准化 Pandas 系列

标签 python pandas dataframe normalization

我正在使用具有以下结构的 DataFrame 学习 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

score1score2 系列的可能值为 -1 和所有正整数(包括 0 )。

我的目标是通过以下方式标准化两列:

  • 如果该值等于 -1,则返回缺失的 NaN
  • 否则,将剩余的正整数按 01 之间的范围标准化。

我不想覆盖原始系列score1score2。相反,我想在两个系列上应用一个函数来创建两个新列(例如 norm1norm2)。

我在这里阅读了几篇文章,建议使用 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 系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57851077/

相关文章:

python - 如何迭代数据框

Python( Pandas )错误 'the label [Algeria] is not in the [index]'

python - Python:列出提取的HTML中的YouTube视频标题和网址

python - 对数据框的交替列求和

Javascript 还是 Python?初学者快速上手

python - 用排序索引替换 Pandas 列

python - 替换 pandas Dataframe 列中的 Unicode 字符

python - 根据条件获取同一 pandas 数据框中同一列的两个值之间的差异

python - 如何一次切片 pandas dataframe 的所有元素?

python - Pandas :将特定行更改为百分比