Вызов пользовательской функции в Pandas

#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)