我有一个看起来像这样的数据框:
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。
任何帮助将不胜感激,谢谢!
答案 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