Преобразование в строки не требуется, лучше преобразовать умноженные значения в integers
и сравнить с 0
:
Total = pd.DataFrame(data=[0.001,0.2,5,0.0002],columns=['Rate'])
s = Total['Rate'] * 100
Total['Rate'] = np.where(s.astype(int) == 0, s, Total['Rate'])
print (Total)
Rate
0 0.10
1 0.20
2 5.00
3 0.02
Подробно :
print (s)
0 0.10
1 20.00
2 500.00
3 0.02
Name: Rate, dtype: float64
print (s.astype(int))
0 0
1 20
2 500
3 0
Name: Rate, dtype: int32
print (s.astype(int) == 0)
0 True
1 False
2 False
3 True
Name: Rate, dtype: bool
Производительность :
Total = pd.DataFrame(data=[0.001,0.2,5,0.0002],columns=['Rate'])
Total = pd.concat([Total] * 10000, ignore_index=True)
In [296]: %%timeit
...: s = Total['Rate'] * 100
...: Total['Rate'] = np.where(s.round() == 0, s, Total['Rate'])
...:
2.09 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [297]: %%timeit
...: Total['Rate'] = Total['Rate'].apply(lambda x: x*100 if str(x)[:4]=='0.00' else x, 1)
...:
26.2 ms ± 1.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
РЕДАКТИРОВАТЬ: Если хотите установить значения для нескольких масок, например, отрицательное значение 0
, используйте numpy.select
:
Total = pd.DataFrame(data=[0.001,0.2,5,0.0002, -10],columns=['Rate'])
s = Total['Rate'] * 100
mask1 = s.astype(int) == 0
mask2 = Total['Rate'] < 0
Total['Rate'] = np.select([mask1, mask2], [s, 0], default=Total['Rate'])
print (Total)
Rate
0 0.10
1 0.20
2 5.00
3 0.02
4 0.00