eduardo radical
¿Cómo obtengo el nombre de la columna de índice en los pandas de Python? Aquí hay un marco de datos de ejemplo:
Column 1
Index Title
Apples 1
Oranges 2
Puppies 3
Ducks 4
Lo que estoy tratando de hacer es obtener/establecer el título del índice del marco de datos. Esto es lo que probé:
import pandas as pd
data = {'Column 1' : [1., 2., 3., 4.],
'Index Title': ["Apples", "Oranges", "Puppies", "Ducks"]}
df = pd.DataFrame(data)
df.index = df["Index Title"]
del df["Index Title"]
Alguien sabe cómo hacer esto?
Simplemente puede obtener/establecer el índice a través de su name
propiedad
In [7]: df.index.name
Out[7]: 'Index Title'
In [8]: df.index.name="foo"
In [9]: df.index.name
Out[9]: 'foo'
In [10]: df
Out[10]:
Column 1
foo
Apples 1
Oranges 2
Puppies 3
Ducks 4
-
A partir de ahora (0.16) no funciona. O más bien, funciona, pero tan pronto como DataFrame se modifica, borra el nombre del índice.
–Piotr Migdal
11/04/2015 a las 20:37
-
debería ser posible especificar el nombre del índice en el momento de la creación de DataFrame. p.ej
pd.DataFrame(values,index={"INDEX_NAME":index_values})
. No entiendo por qué esto no está permitido o implementado.– denfromufa
01/04/2016 a las 14:42
-
puede construir directamente con un índice para agregar un nombre
– Jeff
01/04/2016 a las 16:15
-
@Jeff, parece que su observación de que construir primero el índice (y usarlo para el índice y las columnas del marco de datos) es el enfoque correcto, aunque estoy de acuerdo con
@denfromufa
que debería tomar un dict como parámetros para construir desde pandas.DataFrame– Diego Aguado
7 de marzo de 2017 a las 18:27
-
Si es un Multiíndice, utilice
df.index.names
en lugar dedf.index.name
.– Jasha
2 de septiembre de 2018 a las 0:03
jezrael
Puedes usar rename_axis
para quitar el conjunto a None
:
d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
df = pd.DataFrame(d).set_index('Index Title')
print (df)
Column 1
Index Title
Apples 1.0
Oranges 2.0
Puppies 3.0
Ducks 4.0
print (df.index.name)
Index Title
print (df.columns.name)
None
La nueva funcionalidad funciona bien en cadenas de métodos.
df = df.rename_axis('foo')
print (df)
Column 1
foo
Apples 1.0
Oranges 2.0
Puppies 3.0
Ducks 4.0
También puede cambiar el nombre de las columnas con el parámetro axis
:
d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
df = pd.DataFrame(d).set_index('Index Title').rename_axis('Col Name', axis=1)
print (df)
Col Name Column 1
Index Title
Apples 1.0
Oranges 2.0
Puppies 3.0
Ducks 4.0
print (df.index.name)
Index Title
print (df.columns.name)
Col Name
print df.rename_axis('foo').rename_axis("bar", axis="columns")
bar Column 1
foo
Apples 1.0
Oranges 2.0
Puppies 3.0
Ducks 4.0
print df.rename_axis('foo').rename_axis("bar", axis=1)
bar Column 1
foo
Apples 1.0
Oranges 2.0
Puppies 3.0
Ducks 4.0
De la versión pandas 0.24.0+
es posible usar el parámetro index
y columns
:
df = df.rename_axis(index='foo', columns="bar")
print (df)
bar Column 1
foo
Apples 1.0
Oranges 2.0
Puppies 3.0
Ducks 4.0
Eliminar los nombres de índices y columnas significa establecerlo en None
:
df = df.rename_axis(index=None, columns=None)
print (df)
Column 1
Apples 1.0
Oranges 2.0
Puppies 3.0
Ducks 4.0
Si MultiIndex
solo en índice:
mux = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
list('abcd')],
names=['index name 1','index name 1'])
df = pd.DataFrame(np.random.randint(10, size=(4,6)),
index=mux,
columns=list('ABCDEF')).rename_axis('col name', axis=1)
print (df)
col name A B C D E F
index name 1 index name 1
Apples a 5 4 0 5 2 2
Oranges b 5 8 2 5 9 9
Puppies c 7 6 0 7 8 3
Ducks d 6 5 0 1 6 0
print (df.index.name)
None
print (df.columns.name)
col name
print (df.index.names)
['index name 1', 'index name 1']
print (df.columns.names)
['col name']
df1 = df.rename_axis(('foo','bar'))
print (df1)
col name A B C D E F
foo bar
Apples a 5 4 0 5 2 2
Oranges b 5 8 2 5 9 9
Puppies c 7 6 0 7 8 3
Ducks d 6 5 0 1 6 0
df2 = df.rename_axis('baz', axis=1)
print (df2)
baz A B C D E F
index name 1 index name 1
Apples a 5 4 0 5 2 2
Oranges b 5 8 2 5 9 9
Puppies c 7 6 0 7 8 3
Ducks d 6 5 0 1 6 0
df2 = df.rename_axis(index=('foo','bar'), columns="baz")
print (df2)
baz A B C D E F
foo bar
Apples a 5 4 0 5 2 2
Oranges b 5 8 2 5 9 9
Puppies c 7 6 0 7 8 3
Ducks d 6 5 0 1 6 0
Eliminar los nombres de índices y columnas significa establecerlo en None
:
df2 = df.rename_axis(index=(None,None), columns=None)
print (df2)
A B C D E F
Apples a 6 9 9 5 4 6
Oranges b 2 6 7 4 3 5
Puppies c 6 3 6 3 5 1
Ducks d 4 9 1 3 0 5
Para MultiIndex
en índice y columnas es necesario trabajar con .names
en cambio .name
y establecer por lista o tuplas:
mux1 = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
list('abcd')],
names=['index name 1','index name 1'])
mux2 = pd.MultiIndex.from_product([list('ABC'),
list('XY')],
names=['col name 1','col name 2'])
df = pd.DataFrame(np.random.randint(10, size=(4,6)), index=mux1, columns=mux2)
print (df)
col name 1 A B C
col name 2 X Y X Y X Y
index name 1 index name 1
Apples a 2 9 4 7 0 3
Oranges b 9 0 6 0 9 4
Puppies c 2 4 6 1 4 4
Ducks d 6 6 7 1 2 8
El plural es necesario para verificar/establecer valores:
print (df.index.name)
None
print (df.columns.name)
None
print (df.index.names)
['index name 1', 'index name 1']
print (df.columns.names)
['col name 1', 'col name 2']
df1 = df.rename_axis(('foo','bar'))
print (df1)
col name 1 A B C
col name 2 X Y X Y X Y
foo bar
Apples a 2 9 4 7 0 3
Oranges b 9 0 6 0 9 4
Puppies c 2 4 6 1 4 4
Ducks d 6 6 7 1 2 8
df2 = df.rename_axis(('baz','bak'), axis=1)
print (df2)
baz A B C
bak X Y X Y X Y
index name 1 index name 1
Apples a 2 9 4 7 0 3
Oranges b 9 0 6 0 9 4
Puppies c 2 4 6 1 4 4
Ducks d 6 6 7 1 2 8
df2 = df.rename_axis(index=('foo','bar'), columns=('baz','bak'))
print (df2)
baz A B C
bak X Y X Y X Y
foo bar
Apples a 2 9 4 7 0 3
Oranges b 9 0 6 0 9 4
Puppies c 2 4 6 1 4 4
Ducks d 6 6 7 1 2 8
Eliminar los nombres de índices y columnas significa establecerlo en None
:
df2 = df.rename_axis(index=(None,None), columns=(None,None))
print (df2)
A B C
X Y X Y X Y
Apples a 2 0 2 5 2 0
Oranges b 1 7 5 5 4 8
Puppies c 2 4 6 3 6 5
Ducks d 9 6 3 9 7 0
Y la solución de @Jeff:
df.index.names = ['foo','bar']
df.columns.names = ['baz','bak']
print (df)
baz A B C
bak X Y X Y X Y
foo bar
Apples a 3 4 7 3 3 3
Oranges b 1 2 5 8 1 0
Puppies c 9 6 3 9 6 3
Ducks d 3 2 1 0 1 0
-
También vale la pena señalar, como sugiere phil en otro
df.index.rename('foo', inplace=True)
ver pandas.pydata.org/pandas-docs/stable/generated/…–Tomás Fauskanger
26 de junio de 2018 a las 14:20
-
Importé un diccionario para usarlo como marco de datos, por lo tanto, la columna de índice se configuró automáticamente en Ninguno con las filas numeradas del 1 al 10. Pero me gustaría asignar la columna “nombres” como índice. Y si es posible, haz esto durante el trazado. ¿Es posible hacer esto y es posible hacerlo sobre la marcha mientras planeamos?
– Tokio también
24 de mayo de 2020 a las 8:11
-
jezrael dio la respuesta correcta a la pregunta original, que se refería a los nombres de los índices de las columnas, no a los nombres de los índices de las filas. Además de una explicación completa. Básicamente, para que Radical Edward tenga el nombre de la columna de índice, solo necesita usar df.index.names
– Rodolfo Bugarín
12 de febrero de 2021 a las 12:17
df.index.name
debería hacer el truco.
Pitón tiene un dir
función que le permite consultar atributos de objetos. dir(df.index)
fue útil aquí.
Usar df.index.rename('foo', inplace=True)
para establecer el nombre del índice.
Parece que esta API está disponible desde pandas 0.13.
Si no desea crear una nueva fila, simplemente colóquela en la celda vacía, use:
df.columns.name="foo"
De lo contrario, use:
df.index.name="foo"
-
Acabo de encontrarlo, es un nombre para los nombres de las columnas. No es de extrañar que configurar df.index.name le dé un nuevo nivel. ¡Gracias!
– CW
15 de junio de 2017 a las 15:52
Dusio
La configuración del nombre del índice también se puede lograr en la creación:
pd.DataFrame(data={'age': [10,20,30], 'height': [100, 170, 175]}, index=pd.Series(['a', 'b', 'c'], name="Tag"))
-
Acabo de encontrarlo, es un nombre para los nombres de las columnas. No es de extrañar que configurar df.index.name le dé un nuevo nivel. ¡Gracias!
– CW
15 de junio de 2017 a las 15:52
pnv
df.columns.values
también danos los nombres de las columnas