我有一个数据框
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
之外。另外,我正在寻找一种有效的解决方案,因为数据框可能非常大(比上面的小示例大得多)。
可以使用矢量化的方式:
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
按照您的指示
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