Como obter um valor de um DataFrame Pandas e não o índice e o tipo de objeto

104

Digamos que eu tenha o seguinte DataFrame

Número da letra
A 1
B 2
C 3
D 4

Que pode ser obtido por meio do seguinte código

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)

Agora quero obter o valor C da coluna Letters.

A linha de comando

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

retornará

2 C
Nome: Letras, dtype: objeto

Como posso obter apenas o valor C e não a saída de duas linhas inteiras?

Eduardo
fonte
6
Em uma nota não relacionada, há uma maneira mais agradável de construir seu DataFrame:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron

Respostas:

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

Isso retorna o primeiro elemento no Índice / Série retornado dessa seleção. Nesse caso, o valor é sempre o primeiro elemento.

EDITAR:

Ou você pode executar um loc () e acessar o primeiro elemento dessa forma. Isso era mais curto e é a maneira que implementei no passado.

valkn0t
fonte
2
Eu adoro esse método, mas estou recebendo o aviso:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG
2
@AlexG: você pode usar este em vez disso: df[df.Letters=='C'].Letters.iloc[0]. Ele produz o primeiro elemento (que também é o único) na série de resultados.
Anh-Thi DINH
usando loc [: 1] ainda mostra o índice próximo ao valor :(
Sonic Soul
@AlexG e @Sonic Soul: tente usar em seu df[df.Letters=='C'].Letters.squeeze()lugar. Isso funciona da mesma maneira. :)
user78910
52

Use o valuesatributo para retornar os valores como uma matriz np e, em seguida, use [0]para obter o primeiro valor:

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

Out[4]:
'C'

EDITAR

Eu pessoalmente prefiro acessar as colunas usando operadores subscritos:

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

Isso evita problemas onde os nomes das colunas podem ter espaços ou travessões -que significam acessar usando ..

EdChum
fonte
1
Eu pessoalmente não uso o .para acessar colunas, pois isso nem sempre funcionará, por exemplo, se o nome da coluna começar com um valor numérico ou se houver caracteres não alfa, como um espaço no nome da coluna, então eu sempre prefirodf['col_name']
EdChum
Entendo. É por isso que em todos os lugares que procuro, sempre encontrei a df['col_name']notação em vez da .notação. Obrigado novamente.
Eduardo
1
É realmente irrelevante, mas em sua seleção você acessa a coluna 'Cartas' usando a notação de ponto; df.loc [df.Letters == 'C']. Se houver espaços nos nomes das colunas, você provavelmente deve usar conversores para eliminá-los, como faria se importasse de um arquivo CSV ou Excel.
valkn0t
@ thomas-ato Vou atualizar minha resposta, mas discordo em modificar as colunas como uma etapa adicional, a menos que seja necessário; neste caso, concordo que não faz diferença
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'

editar:

na verdade, você pode apenas indexar o conjunto de dados como qualquer array antigo.

import pandas as pd

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

>>> print(first_value)
'item_0'
Lewis
fonte