Comment obtenir une valeur d'un Pandas DataFrame et non de l'index et du type d'objet

104

Disons que j'ai le DataFrame suivant

Numéro de lettre
A 1
B 2
C 3
D 4

Qui peut être obtenu via le code suivant

import pandas as pd

letters=pd.Series(('A', 'B', 'C', 'D'))
numbers=pd.Series((1, 2, 3, 4))
keys=('Letters', 'Numbers')
df=pd.concat((letters, numbers), axis=1, keys=keys)

Maintenant, je veux obtenir la valeur C de la colonne Lettres.

La ligne de commande

df[df.Letters=='C'].Letters

reviendra

2 C
Nom: Lettres, type: objet

Comment puis-je obtenir uniquement la valeur C et non la sortie sur deux lignes?

Eduardo
la source
6
Sur une note sans rapport, il existe une meilleure façon de construire votre DataFrame:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron

Réponses:

144
df[df.Letters=='C'].Letters.item()

Cela renvoie le premier élément de l'Index / Série renvoyé par cette sélection. Dans ce cas, la valeur est toujours le premier élément.

ÉDITER:

Ou vous pouvez exécuter un loc () et accéder au premier élément de cette façon. C'était plus court et c'est la façon dont je l'ai mis en œuvre dans le passé.

valkn0t
la source
2
J'adore cette méthode, mais je reçois l'avertissement:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG
2
@AlexG: vous pouvez l' utiliser à la place: df[df.Letters=='C'].Letters.iloc[0]. Il produit le premier élément (qui est également l'unique) dans la série de résultats.
Anh-Thi DINH
l'utilisation de loc [: 1] affiche toujours l'index à côté de la valeur :(
Sonic Soul le
@AlexG et @Sonic Soul: essayez d'utiliser à la df[df.Letters=='C'].Letters.squeeze()place. Cela fonctionne de la même manière. :)
user78910
52

Utilisez l' valuesattribut pour renvoyer les valeurs sous forme de tableau np, puis utilisez [0]pour obtenir la première valeur:

In [4]:
df.loc[df.Letters=='C','Letters'].values[0]

Out[4]:
'C'

ÉDITER

Personnellement, je préfère accéder aux colonnes en utilisant des opérateurs d'indice:

df.loc[df['Letters'] == 'C', 'Letters'].values[0]

Cela évite les problèmes où les noms de colonne peuvent avoir des espaces ou des tirets, -ce qui signifie que l'accès à l'aide de ..

EdChum
la source
1
Personnellement, je n'utilise pas les .colonnes pour accéder car cela ne fonctionnera pas toujours, par exemple si le nom de la colonne commence par une valeur numérique ou s'il y a des caractères non alpha tels qu'un espace dans le nom de la colonne, donc je préfère toujoursdf['col_name']
EdChum
Je vois. C'est pourquoi partout où je regarde, j'ai toujours trouvé la df['col_name']notation au lieu de la .notation. Merci encore.
Eduardo
1
C'est vraiment sans importance, mais dans votre sélection, vous accédez à la colonne «Lettres» en utilisant la notation par points; df.loc [df.Letters == 'C']. S'il y a des espaces dans vos noms de colonnes, vous devriez probablement utiliser des convertisseurs pour les supprimer, comme vous le feriez si vous importiez à partir d'un fichier CSV ou Excel.
valkn0t
@ thomas-ato Je vais mettre à jour ma réponse mais je ne suis pas d'accord avec la modification des colonnes comme étape supplémentaire sauf si cela est nécessaire, dans ce cas je suis d'accord que cela ne fait aucune différence
EdChum
1
import pandas as pd

dataset = pd.read_csv("data.csv")
values = list(x for x in dataset["column name"])

>>> values[0]
'item_0'

Éditer:

en fait, vous pouvez simplement indexer l'ensemble de données comme n'importe quel ancien tableau.

import pandas as pd

dataset = pd.read_csv("data.csv")
first_value = dataset["column name"][0]

>>> print(first_value)
'item_0'
Lewis
la source