J'essaie d'appliquer une fonction .Apply qui utilise def per_node_price_score(row):
try:
if row['deal_type'] == 'New' and row['product_group'] == 'Prod':
return product_and_range_new_prod.loc[product_and_range_new_prod['product_and_range_p_n'] == row['price_per_node']].iloc[-1]['score_p_n']
elif row['deal_type'] == 'New' and row['product_group'] == 'Non-Prod':
return product_and_range_new_non_prod.loc[product_and_range_new_non_prod['product_and_range_np_n'] == row['price_per_node']].iloc[-1]['score_np_n']
elif row['deal_type'] == 'Expansion' and row['product_group'] == 'Prod':
return product_and_range_expansion_prod.loc[product_and_range_expansion_prod['product_and_range_p_e'] == row['price_per_node']].iloc[-1]['score_p_e']
elif row['deal_type'] == 'Expansion' and row['product_group'] == 'Non-Prod':
return product_and_range_expansion_non_prod.loc[product_and_range_expansion_non_prod['product_and_range_np_e'] == row['price_per_node']].iloc[-1]['score_np_e']
except: IndexError
df['per_node_price_score'] = df.apply(per_node_price_score, axis=1)
df.head(5)
3 Réponses :
La logique que vous avez écrite ne devrait pas retourner une valeur autant que je puisse dire. Vous indiquez à la fonction de renvoyer un index de mais quand est-ce que cela se produit? Vous devez organiser vos données un peu différemment. Ce que vous voulez, c'est qu'il retourne l'index lorsque le prix_per_node est dans la plage répertorie. Tout d'abord, la gamme doit être séparée des informations de base / avancées. Ensuite, il est probablement judicieux de répertorier la plage de deux colonnes max et min distinctes, puis utilisez-la supérieure ou inférieure à la logique pour trouver le bon indice avec le prix du produit P> aussi, c'est peut-être une bonne idée de Combinez vos quatre dataframes et utilisez leurs titres descriptifs comme une colonne supplémentaire. En fin de compte, si vous suivez tout cela, votre Dataframe ressemblerait à ce problème p> Un autre problème est que vous référencez d'autres données de données dans votre fonction qui ne sont pas transmises. Vous pouvez ajouter des arguments à votre fonction Apply, comme décrit dans le Documentation , mais vous aurez probablement besoin de référencer vos variables différemment. p> Par exemple, si vous passez le long de vos arguments en tant que kwargs (arguments mots clés), vous devrez les référencez comme valeurs de dictionnaire. J'ai écrit un exemple trivial ci-dessous p> produit_and_range_new_prod code> quand
Il s'agit de clarifier quelque chose et d'expliquer, pourquoi je pense que votre logique ne fait pas, ce que vous attendez:
Dans votre fonction Apply, vous vérifiez Si je n'ai pas manqué quelque chose, Avez-vous peut-être voulu "rechercher" sur un autre champ ou "recherche" en fonction de l'index?
L'indice ci-dessus ne semble pas être aligné sur tous les dataframes ou est-ce? P> Dans les deux cas, je pense que vous pouvez faire votre "recherche" plus efficacement. P> p> deal_type code> et prod_group code >. Dans le tout premier si code> -clause, vous retournez la valeur d'une expression équivalente à (juste reformatées / variables assignées pour tout voir à un seul coup d'œil): p> indexer code> sera faux code> pour toutes les lignes, car valeur code> est un float code> valeur, tandis que produit_and_range_new_prod ['product_and_range_p_n'] code> est une chaîne comme de base 3-4k ' code> et donc ce que vous revenez ne sera rien. Vous obtenez probablement un IndexError code> pour toutes les lignes. P>
si Code> - elif code> Logic fonctionne sans problème: h2> Dataframe ( df code>) h3>
Bonjour, il est difficile de dire, qu'est-ce qui ne va pas, mais ce qui a sauté directement dans mes yeux, c'est que vos dataframes ont des indices INT réguliers et il me semble que ces indices ne sont pas alignés. Veuillez également ajouter une description, de ce que votre fonction devrait faire et la taille de vos données de données. Peut-être qu'il y a une autre solution pour résoudre ce problème sans utiliser de fonction Appliquer. Consultez mon message ci-dessous pour une description de ce que je pense pourquoi vous n'obtenez pas votre résultat prévu.