Python - применить формулу, если условие выполнено - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь изменить значение в кадре данных, если оно начинается с чего-то.Я проверяю, являются ли первые 4 значения 0,00, если оно начинается с 0,00, я хочу умножить это значение на 100. Приведенная ниже формула дает мне эту ошибку

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), 
a.item(), a.any() or a.all().

Моя формула

Total['Rate']=Total['Rate'].apply(lambda x: Total['Rate']*100 if \ 
Total['Rate'].str[:4]=='0.00' else Total['Rate'])

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Преобразование в строки не требуется, лучше преобразовать умноженные значения в 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
0 голосов
/ 21 февраля 2019

Вы так близки, проблема в том, что в вашей лямбда-функции вы пытаетесь умножить весь столбец, а не просто значение.

Изменив их на x, как показано ниже, выполучил.

Total['Rate'] = Total['Rate'].apply(lambda x: x*100 if str(x)[:4]=='0.00' else x, 1)

Надеюсь, это поможет!

0 голосов
/ 21 февраля 2019

Используйте это вместо:

Total['Rate']=Total['Rate'].mask(Total['Rate'].str.startswith('0.00'), Total['Rate']*100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...