Skip to main content
 首页 » 编程设计

python之基于 bool 值更改 pd.df 列中值的矢量化解决方案

2025年05月04日13fff_TT

我的 df 看起来像这样:

              code       date type  strike  settlement 
0   CBT_21_G2015_S 2015-01-02    C   126.2    1.343750 
1   CBT_21_G2015_S 2015-01-02    P   131.7    4.359375 
2   CBT_21_G2015_S 2015-01-02    C   102.5   24.671875 
3   CBT_21_G2015_S 2015-01-02    P   110.5    0.015625 
4   CBT_21_G2015_S 2015-01-02    P   101.2    0.015625 
5   CBT_21_G2015_S 2015-01-02    C   140.5    0.015625 

我希望通过执行以下操作将罢工更改为四分之一罢工:if df['strike'] % 0.25 != 0 add 0.05。

期望的输出:

              code       date type  strike  settlement 
0   CBT_21_G2015_S 2015-01-02    C   126.25   1.343750 
1   CBT_21_G2015_S 2015-01-02    P   131.75   4.359375 
2   CBT_21_G2015_S 2015-01-02    C   102.5   24.671875 
3   CBT_21_G2015_S 2015-01-02    P   110.5    0.015625 
4   CBT_21_G2015_S 2015-01-02    P   101.25   0.015625 
5   CBT_21_G2015_S 2015-01-02    C   140.5    0.015625 

请问最简单/最快的方法是什么?

请您参考如下方法:

np.ceil 的一点数学魔法 -

df['strike'] = np.ceil(df.strike * 4) / 4 

df 
             code        date type  strike  settlement 
0  CBT_21_G2015_S  2015-01-02    C  126.25    1.343750 
1  CBT_21_G2015_S  2015-01-02    P  131.75    4.359375 
2  CBT_21_G2015_S  2015-01-02    C  102.50   24.671875 
3  CBT_21_G2015_S  2015-01-02    P  110.50    0.015625 
4  CBT_21_G2015_S  2015-01-02    P  101.25    0.015625 
5  CBT_21_G2015_S  2015-01-02    C  140.50    0.015625 

它真的很快,正如时间显示的那样。

df = pd.concat([df] * 100000, ignore_index=True) 
 
%timeit np.ceil(df.strike.values * 4) / 4 
5.1 ms ± 60.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)