204 votes

Extraction de la valeur d'une colonne en fonction d'une autre colonne dans un cadre de données pandas

Je suis un peu bloqué sur l'extraction de la valeur d'une variable conditionnant une autre variable. Par exemple, le dataframe suivant :

A  B
p1 1
p1 2
p3 3
p2 4

Comment puis-je obtenir la valeur de A quand B=3 ? Chaque fois que j'ai extrait la valeur de A j'ai obtenu un objet, pas une chaîne.

0 votes

Je vois, je devrais ajouter item() à la fin.

0 votes

df.query y pd.eval semblent convenir à ce cas d'utilisation. Pour plus d'informations sur le pd.eval() de la famille de fonctions, de leurs caractéristiques et de leurs cas d'utilisation, veuillez consulter le site suivant Évaluation dynamique d'expressions dans pandas avec pd.eval() .

340voto

Anton Protopopov Points 7767

Vous pourriez utiliser loc pour obtenir des séries qui satisfont à votre condition et ensuite iloc pour obtenir le premier élément :

In [2]: df
Out[2]:
    A  B
0  p1  1
1  p1  2
2  p3  3
3  p2  4

In [3]: df.loc[df['B'] == 3, 'A']
Out[3]:
2    p3
Name: A, dtype: object

In [4]: df.loc[df['B'] == 3, 'A'].iloc[0]
Out[4]: 'p3'

38 votes

Merci pour votre aide. df.loc[df['B'] == 3, 'A'].item() fonctionne pour moi aussi.

9 votes

Lequel choisit-il si le cadre de données a plusieurs entrées de '3' dans la colonne B ?

1 votes

Df.loc[df["Condition_Column"] == 0, ("Column_1", "Column_2", "Column_3", "Column_4")] fonctionne pour moi. Cet exemple permet de sélectionner plusieurs colonnes. Elles devraient être dans un tuple.

71voto

PhilChang Points 1148

Vous pouvez essayer query ce qui permet de moins taper :

df.query('B==3')['A']

0 votes

La requête est intéressante car nous pouvons y ajouter des clauses plus complexes.

2 votes

IMHO, c'est la meilleure réponse.

0 votes

@NLR Cela dépend. query crée un nouveau DataFrame et ensuite la tranche ['A'] crée un autre DataFrame . Pour les cas importants, on aimerait éviter les objets intermédiaires inutiles.

46voto

emited Points 91

df[df['B']==3]['A'] en supposant que df est votre pandas.DataFrame.

0 votes

Pouvez-vous donner un lien où exactement cette méthode est décrite dans la documentation officielle de pandas ?

0 votes

Je veux dire ][ partie.

1 votes

@vasili111 vérifie le filtre pandas

21voto

Baz Points 438

Utilice df[df['B']==3]['A'].values si vous voulez juste l'article lui-même sans les parenthèses

0 votes

Pouvez-vous donner un lien où exactement cette méthode est décrite dans la documentation officielle de pandas ? Je veux dire ][ partie.

0 votes

Il renvoie bien le résultat avec []

3 votes

Vous devez toujours mettre [0] à la fin pour accéder à la valeur.

13voto

drT Points 91

C'est plus facile pour moi de penser en ces termes, mais en empruntant d'autres réponses. La valeur que vous voulez est située dans la série :

df[*column*][*row*]

donde colonne y rangée pointent sur les valeurs que vous voulez renvoyer. Pour votre exemple, colonne est "A" et pour rangée vous utilisez un masque :

df['B'] == 3

Pour obtenir la première valeur appariée de la série, il existe plusieurs options :

df['A'][df['B'] == 3].values[0]
df['A'][df['B'] == 3].iloc[0]
df['A'][df['B'] == 3].to_numpy()[0]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X