基于另一列的 Pandas 数据框缩放列

时间:2021-06-23 14:29:06

标签: python pandas dataframe

我有一个看起来像这样的数据框:

var execute = (command) => {
  const ffmpeg = spawn("./bin/ffmpeg/ffmpeg", command);
  ffmpeg.stderr.on("data", (data) => {
    debug(data.toString());
  });

  ffmpeg.on("close", () => {
    console.log('DONE');
  });
};

var sourceFilePath = '/tmp/test.mp4';
var outputPath = '/tmp/test_processed.mp4';
var ss = 5;
var t = 10;

execute([
  "-i",
  sourceFilePath,
  "-ss",
  ss,
  "-t",
  t,
  outputPath,
]);

await uploadTos3(outputPath); // Helper function to upload processed file to s3

其中 cat val 0 1 10 1 1 4 2 2 6 3 2 2 4 1 8 5 2 12 是类别,cat 是值。我想创建一个名为 val 的列,它按类别线性缩放/归一化为 0-1。 我知道如何在列级别执行前者 - scaled - 我也知道如何在每个类别的基础上执行操作,我只是不知道如何将两者结合起来。想要的结果是:

((val - min) / (max - min))

理想情况下,我想坚持只使用 Pandas。

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

您的缩放比例是减去最小值并除以范围,因此使用 groupby + transform 将这些属性广播回该组的每一行并进行数学计算。

import numpy as np

gp = df.groupby('cat')['val']

df['scaled'] = (df['val'] - gp.transform(min))/gp.transform(np.ptp)

   cat  val    scaled
0    1   10  1.000000
1    1    4  0.000000
2    2    6  0.400000
3    2    2  0.000000
4    1    8  0.666667
5    2   12  1.000000

对于减少为标量的聚合,groupby + agg/apply 减少为每组一行;但是 groupby + transform 返回一个类似索引的系列,以便它与原始 DataFrame 对齐。

gp.min()
#cat
#1    4
#2    2
#Name: val, dtype: int64

gp.transform(min)
#0    4
#1    4
#2    2
#3    2
#4    4
#5    2
#Name: val, dtype: int64