#pandas
#pandas
Вопрос:
У меня определены 2 разные пользовательские функции. Первая функция принимает один аргумент, а вторая функция принимает два аргумента. Но способ вызова функции отличается, почему я не могу вызвать вторую функцию так, как вызывается первая функция? Ниже приведены мои две функции и то, как я их вызываю.
Function with single argument:-
def convert_sqft_to_num(x):
tokens = x.split('-')
if len(tokens) == 2:
return (float(tokens[0]) float(tokens[1]))/2
try:
return float(x)
except:
return None
df1.total_sqft = df1.total_sqft.apply(convert_sqft_to_num)
Second function with multiple arguments:-
def corr_sft_outlier(in_bhk, in_sft):
bhk_band = np.quantile(outlierdf2[outlierdf2.bhk_size==in_bhk]['avg_sft'], (.20,.90))
lower_band = round(bhk_band[0])
upper_band = round(bhk_band[1])
if (in_sft>=lower_band)amp;(in_sft<=upper_band):
return in_sft
elif (in_sft<lower_band):
return lower_band
elif (in_sft>upper_band):
return upper_band
else:
return None
Ниже приведен второй вызов функции
outlierdf2['adj_avg_sft'] = outlierdf2.apply(lambda x: corr_sft_outlier(x['bhk_size'],x['avg_sft']), axis=1)
Я хочу вызвать указанную выше функцию, как показано ниже
outlierdf2['adj_avg_sft'] = outlierdf2[['bhk_size','avg_sft']].apply(corr_sft_outlier)
Комментарии:
1. Не уверен, что понимаю. Это не работает?: outlierdf 2[‘adj_avg_sft’] = outlierdf 2.apply(лямбда x: corr_sft_outlier(x[‘bhk_size’],x[‘avg_sft’]), ось = 1)
Ответ №1:
В этой части вы не можете вызвать функцию, которая имеет 2 аргумента с 1 параметрами :
outlierdf2[['bhk_size','avg_sft']].apply(corr_sft_outlier)
вы передаете «строку df с 2 столбцами», а не 2 значения. Итак, создаете ли вы фрейм из двух столбцов (т.Е. outlierdf 2[[«bhk_size»,»avg_sft»]].apply) или вызываете его с помощью самого df (т.Е. outlierdf 2.apply), вы должны передать нужное количество параметров. Итак, вы можете изменить свою функцию таким образом, а затем вызвать ее так, как хотите:
def corr_sft_outlier(row):
in_bhk, in_sft = row['bhk_size'],row['avg_sft']
bhk_band = np.quantile(outlierdf2[outlierdf2.bhk_size==in_bhk]['avg_sft'], (.20,.90))
lower_band = round(bhk_band[0])
upper_band = round(bhk_band[1])
if (in_sft>=lower_band)amp;(in_sft<=upper_band):
return in_sft
elif (in_sft<lower_band):
return lower_band
elif (in_sft>upper_band):
return upper_band
else:
return None
outlierdf2['adj_avg_sft'] = outlierdf2[['bhk_size','avg_sft']].apply(corr_sft_outlier,axis=1)