Cómo obtener un valor de un Pandas DataFrame y no el índice y el tipo de objeto

104

Digamos que tengo el siguiente DataFrame

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

Que se puede obtener a través del siguiente 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)

Ahora quiero obtener el valor C de la columna Letras.

La linea de comando

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

volverá

2 C
Nombre: Letras, dtipo: objeto

¿Cómo puedo obtener solo el valor C y no la salida completa de dos líneas?

Eduardo
fuente
6
En una nota no relacionada, hay una mejor manera de construir su DataFrame:pd.DataFrame({'Letters': letters, 'Numbers': numbers})
JoeCondron

Respuestas:

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

Esto devuelve el primer elemento del índice / serie devuelto por esa selección. En este caso, el valor es siempre el primer elemento.

EDITAR:

O puede ejecutar un loc () y acceder al primer elemento de esa manera. Esto fue más corto y es la forma en que lo he implementado en el pasado.

valkn0t
fuente
2
Me encanta este método, sin embargo, recibo la advertencia:FutureWarning: "item" has been deprecated and will be removed in a future version
AlexG
2
@AlexG: se puede utilizar en su lugar: df[df.Letters=='C'].Letters.iloc[0]. Produce el primer elemento (que también es el único) en la serie de resultados.
Anh-Thi DINH
el uso de loc [: 1] todavía muestra el índice junto al valor :(
Sonic Soul
@AlexG y @Sonic Soul: intente usar en su df[df.Letters=='C'].Letters.squeeze()lugar. Esto funciona de la misma manera. :)
user78910
52

Use el valuesatributo para devolver los valores como una matriz np y luego use [0]para obtener el primer valor:

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

Out[4]:
'C'

EDITAR

Yo personalmente prefiero acceder a las columnas usando operadores de subíndice:

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

Esto evita problemas en los que los nombres de las columnas pueden tener espacios o guiones, lo -que significa que se accede usando ..

EdChum
fuente
1
Personalmente, no uso el .para acceder a las columnas, ya que esto no siempre funcionará, por ejemplo, si el nombre de la columna comienza con un valor numérico o si hay caracteres no alfabéticos, como un espacio en el nombre de la columna, así que siempre lo prefierodf['col_name']
EdChum
Veo. Es por eso que dondequiera que miro, siempre encuentro la df['col_name']notación en lugar de la .notación. Gracias de nuevo.
Eduardo
1
Es realmente intrascendente, pero en su selección accede a la columna 'Letras' usando la notación de puntos; df.loc [df.Letters == 'C']. Si hay espacios en los nombres de sus columnas, probablemente debería usar convertidores para eliminarlos, como lo haría si importara desde un archivo CSV o Excel.
valkn0t
@ thomas-ato Actualizaré mi respuesta, pero no estoy de acuerdo con modificar las columnas como un paso adicional a menos que sea necesario, en este caso, estoy de acuerdo en que no hay diferencia
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:

en realidad, puede indexar el conjunto de datos como cualquier matriz anterior.

import pandas as pd

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

>>> print(first_value)
'item_0'
Luis
fuente