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?
3 Réponses :
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')
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
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)
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! :)
suivant votre logique et vos données, seule la quatrième ligne est la résultante ...
Vous avez raison. J'ai amendé.