Tengo un marco de datos donde los índices no son números sino cadenas (específicamente, el nombre de los países) y todos son únicos. Dado el nombre de un país, ¿cómo encuentro su número de fila (el valor 'número' del índice)?
df[df.index == 'country_name'].index pero esto no funciona.
pd.Index.get_indexer Podemos usar pd.Index.get_indexer para obtener un índice entero.
idx = df.index.get_indexer(list_of_target_labels) # If you only have single label we can use tuple unpacking here. [idx] = df.index.get_indexer([country_name])NB:
pd.Index.get_indexertoma una lista y devuelve una lista. Números enteros de 0 a n - 1 que indican que el índice en estas posiciones coincide con los valores objetivo correspondientes. Los valores que faltan en el objetivo están marcados con -1.
np.where También puede usar np.where aquí.
idx = np.where(df.index == country_name)[0]list.index También podríamos usar list.index después de convertir Pd.Index a list usando pd.Index.tolist
idx = df.index.tolist().index(country_name)Podemos usar Index.get_indexer :
df.index.get_indexer(['Peru']) [3] O podemos construir un RangeIndex basado en el tamaño del DataFrame y luego subdividirlo en su lugar:
pd.RangeIndex(len(df))[df.index == 'Peru'] Int64Index([3], dtype='int64') Dado que solo estamos buscando una sola etiqueta y los índices son "todos únicos", también podemos usar Index.get_loc :
df.index.get_loc('Peru') 3Marco de datos de muestra:
import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3, 4, 5] }, index=['Bahamas', 'Cameroon', 'Ecuador', 'Peru', 'Japan']) df .:
A Bahamas 1 Cameroon 2 Ecuador 3 Peru 4 Japan 5¿Por qué no hace que el índice se cree con números en lugar de texto? Porque su df se puede ordenar de muchas maneras más allá del alfabético, y puede perder el conteo de filas. Con índice numerado esto no sería un problema.