Используйте numpy.where
для установленных значений:
#extract numeric to Series
d = df['Number'].str.extract('(\d+)', expand=False)
#test if digit
mask1 = d.str.isdigit().fillna(False)
# проверка, если значения содержат кг
mask2 = df ['Number']. str.contains ('kg', na = False)
df['Number'] = np.where(mask1, d,
np.where(mask2 & ~mask1, 'kg',np.nan))
print (df)
Number
0 1
1 2
2 kg
3 nan
4 3
Ваше решение должно быть изменено:
import re
def NumorKG(x):
a = re.findall('(\d+)', x)
if len(a) > 0:
return a[0]
elif 'kg' in x:
return 'kg'
else:
return np.nan
df['Number']=df['Number'].apply(NumorKG)
print (df)
Number
0 1
1 2
2 kg
3 NaN
4 3
И ваша лямбда-функция должна быть изменена:
NumorKG = lambda x: re.findall('(\d+)', x)[0]
if len(re.findall('(\d+)', x)) > 0
else 'kg'
if 'kg' in x
else np.nan