Причина, по которой вы получаете None
, заключается в том, что ни один из путей вашего блока if-elseif
не возвращает true, поэтому myFunction
возвращает None
.Вы имели в виду if-else
?
Кроме того, чтобы очистить то, что у тебя есть, я бы сделал немного иначе.Первые q22, q45 и qc нужно вычислять только один раз (на основе логики выше), и они могут быть переданы в функцию, а не вычисляться каждый раз в функции.Во-вторых, вам не нужно создавать lambda
в этой ситуации, apply
( docs ) принимает вызываемый Python (ваша функция), и можно передавать дополнительные аргументы, как показано ниже.
df = pd.DataFrame({
'num_likes': [464.0, 364.0, 487.0, 258.0, 125.0],
'num_post': [142.0, 125.0, 106.0, 123.0, 103.0]
})
def myFunction(x, q22, q45, qc):
k = 3
if x >= q45 + k * qc:
return q45 + k * qc
elif x <= q22 - k * qc:
return q22 - k * qc
else:
return -1
q22 = df["num_likes"].quantile(0.22)
q45 = df["num_likes"].quantile(0.45)
qc = q45 - q22
# pass additional arguments in an tuple, they will be passed to myFunction
df.num_likes.apply(myFunction, args=(q22, q45, qc))
# this will return a series which can be assigned to new column
# 0 -1
# 1 -1
# 2 -1
# 3 -1
# 4 -1
# Name: num_likes, dtype: int64