0
votes

Pandas: Aucun Données retournées avec la fonction SI et Conditionnelle Appliquer

J'essaie d'appliquer une fonction .Apply qui utilise si strong> avec la logique et strie> par ligne pour remplir une colonne basée sur les valeurs de deux autres colonnes. Dans mon ensemble de données, j'ai deux colonnes que je veux vérifier si les rangées sont admissibles avant d'appliquer la recherche que je veux. Dans mon cadre de mappage de mappage, j'ai divisé en 4 cadres de données distincts.

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)


1 commentaires

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.


3 Réponses :


0
votes

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 produit_and_range_new_prod quand xxx

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

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 xxx

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.

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 xxx


0 commentaires

0
votes

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 deal_type et prod_group . Dans le tout premier si -clause, vous retournez la valeur d'une expression équivalente à (juste reformatées / variables assignées pour tout voir à un seul coup d'œil): xxx < / pré>

Si je n'ai pas manqué quelque chose, indexer sera faux pour toutes les lignes, car valeur est un float valeur, tandis que produit_and_range_new_prod ['product_and_range_p_n'] est une chaîne comme de base 3-4k ' et donc ce que vous revenez ne sera rien. Vous obtenez probablement un IndexError pour toutes les lignes.

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?

Dans les deux cas, je pense que vous pouvez faire votre "recherche" plus efficacement.


0 commentaires

0
votes

Ces conditions ne sont jamais remplies: xxx

sont des exemples de ce qui est comparé: xxx

si - elif Logic fonctionne sans problème:

Dataframe ( df )

 Entrez la description de l'image ici < / a>

fonction xxx

appel de fonction xxx
  • Compte tenu de l'appel de la fonction, nous pouvons voir à partir de la sortie que chaque si / elif est rempli


0 commentaires