2
votes

Les pandas utilisent la valeur de la cellule comme clé dict pour renvoyer la valeur dict

Ma question concerne l'utilisation des valeurs dans une colonne de dataframe comme clés afin de renvoyer leurs valeurs respectives et d'exécuter un conditionnel.

J'ai un dataframe, df, contenant une colonne "count" qui a des entiers de 1 à 8 et une colonne "category" qui a les valeurs "A", "B" ou "C"

J'ai un dictionnaire, dct, contenant les paires A: 2, B: 4, C: 6

Voici mon code (incorrect):

result = df[df["count"] >= dct.get(df["category"])]

Donc je veux retourner un dataframe où la valeur "count" pour une ligne donnée est égale à plus que la valeur extraite d'un dictionnaire en utilisant la lettre "category" dans la même ligne.

Donc, s'il y avait des valeurs de comptage de (1, 2, 6, 6) et des valeurs de catégorie de (A, B, C, A), la troisième et la quatrième ligne seraient renvoyées dans le dataframe résultant.

Comment puis-je modifier le code ci-dessus pour y parvenir?


2 commentaires

suivant votre logique et vos données, seule la quatrième ligne est la résultante ...


Vous avez raison. J'ai amendé.


3 Réponses :


3
votes

Une bonne façon de procéder est d'ajouter votre dictionnaire dans un dataframe existant, puis d'appliquer une requête sur le nouveau dataframe:

import pandas as pd
df = pd.DataFrame(data={'count': [4, 5, 6], 'category': ['A', 'B', 'C']})
dct = {'A':5, 'B':4, 'C':-1}
df['min_count'] = df['category'].map(dct)
df = df.query('count>min_count')


2 commentaires

Il n'y a donc aucun moyen de faire un petit ajustement à mon code pour y parvenir? Sinon, je peux opter pour la méthode que vous avez fournie - merci pour cela.


Je pense que vous devriez aller avec ma solution, l'approuver pls



0
votes

suivant votre logique:

original dataframe
   count category
0      1        A
1      2        B
2      5        C
3      6        A

final output
   count category
3      6        A

sortie:

import pandas as pd

dct = {'A':2, 'B':4, 'C':6}
df = pd.DataFrame({'count':[1,2,5,6],
                   'category':['A','B','C','A']})

print('original dataframe')
print(df)

def process_row(x):
    return True if x['count'] >= dct[x['category']] else False

f = df.apply(lambda row: process_row(row), axis=1)
df = df[f]

print('final output')
print(df)


0 commentaires

0
votes

Une petite modification de votre code:

result = df[df['count'] >= df['category'].apply(lambda x: dct[x])]

Vous ne pouvez pas utiliser directement dct.get (df ['category']) car df [' category '] renvoie une série mutable qui ne peut pas être utilisée comme clé de dictionnaire (les clés de dictionnaire doivent être des objets immuables) Alors, appliquez et lambda à la rescousse! :)


0 commentaires