按列对数据帧进行分组,处理值并根据处理后的值标准化其他列

问题描述 投票:0回答:2

我有一个数据框

df
,有两列,
foo
bar

             foo       bar
0   2410_030_GCD  0.012093
1   2410_030_GCD  0.012789
2   2410_030_GCD  0.014205
3   2410_010_GCD  0.016280
4   2410_010_GCD  0.019738
5   6122_020_LCM  0.025806
6   6122_020_LCM  0.030336
7   6122_020_LCM  0.034753
8   6122_020_LCM  0.042229
9   3456_030_SGD  0.025792
10  3456_030_SGD  0.030255
11  3456_030_SGD  0.034683
12  3456_030_SGD  0.042194

对于

foo
具有相同值的每组行,我想从 'foo' 中提取 4 个连续数字的第一个子字符串(即
'2410'
if
foo = '2410_030_GCD'
),转换为
float
,除以除以 1000,然后将
bar
的值除以结果值,将结果存储在名为
baz
的新列中。换句话说,输出必须是

             foo       bar        baz
0   2410_030_GCD  0.012093  0.0050178
1   2410_030_GCD  0.012789  0.0053066
2   2410_030_GCD  0.014205  0.0058942
3   2410_010_GCD  0.016280  0.0067552
4   2410_010_GCD  0.019738  0.0081900
5   6122_020_LCM  0.025806  0.0042153
6   6122_020_LCM  0.030336  0.0049552
7   6122_020_LCM  0.034753  0.0056767
8   6122_020_LCM  0.042229  0.0068979
9   3456_030_SGD  0.025792  0.0074630
10  3456_030_SGD  0.030255  0.0087543
11  3456_030_SGD  0.034683  0.0100356
12  3456_030_SGD  0.042194  0.0122089

由于

df
作为各个函数之间的参数传递,因此我宁愿不向
df
添加其他(中间?)列,除了
baz
之外。另外,我正在寻找一种有效的解决方案,因为数据框可能非常大(比上面的小示例大得多)。

python pandas group-by python-re
2个回答
0
投票

可以使用矢量化的方式:

df['baz'] = df['bar'].div(df['foo'].str[:4].astype(float).div(1000))

输出:

>>> df
             foo       bar       baz
0   2410_030_GCD  0.012093  0.005018
1   2410_030_GCD  0.012789  0.005307
2   2410_030_GCD  0.014205  0.005894
3   2410_010_GCD  0.016280  0.006755
4   2410_010_GCD  0.019738  0.008190
5   6122_020_LCM  0.025806  0.004215
6   6122_020_LCM  0.030336  0.004955
7   6122_020_LCM  0.034753  0.005677
8   6122_020_LCM  0.042229  0.006898
9   3456_030_SGD  0.025792  0.007463
10  3456_030_SGD  0.030255  0.008754
11  3456_030_SGD  0.034683  0.010036
12  3456_030_SGD  0.042194  0.012209

0
投票

按照您的指示

df['extracted'] = df['foo'].str.extract(r'(\d{4})').astype(float)

df['baz'] = df['bar'] / (df['extracted'] / 1000)

df.drop(columns=['extracted'], inplace=True)

输出:

             foo       bar       baz
0   2410_030_GCD  0.012093  0.005018
1   2410_030_GCD  0.012789  0.005307
2   2410_030_GCD  0.014205  0.005894
3   2410_010_GCD  0.016280  0.006755
4   2410_010_GCD  0.019738  0.008190
5   6122_020_LCM  0.025806  0.004215
6   6122_020_LCM  0.030336  0.004955
7   6122_020_LCM  0.034753  0.005677
8   6122_020_LCM  0.042229  0.006898
9   3456_030_SGD  0.025792  0.007463
10  3456_030_SGD  0.030255  0.008754
11  3456_030_SGD  0.034683  0.010036
12  3456_030_SGD  0.042194  0.012209
© www.soinside.com 2019 - 2024. All rights reserved.