Estoy tratando de acceder al índice de una fila en una función aplicada en todo un DataFrame
Pandas. Tengo algo como esto:
df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
a b c
0 1 2 3
1 4 5 6
y definiré una función que acceda a elementos con una fila determinada
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Puedo aplicarlo así:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
¡Increíble! Ahora, ¿qué pasa si quiero incorporar el índice en mi función? El índice de cualquier fila dada en esto DataFrame
antes de agregar d
sería Index([u'a', u'b', u'c', u'd'], dtype='object')
, pero quiero el 0 y el 1. Así que no puedo acceder row.index
.
Sé que podría crear una columna temporal en la tabla donde almaceno el índice, pero me pregunto si está almacenado en el objeto de fila en algún lugar.
apply
? Es mucho más lento que realizar operaciones vectorizadas en el propio marco. (A veces, aplicar es la forma más sencilla de hacer algo, y las consideraciones de rendimiento a menudo se exageran, pero para su ejemplo particular es tan fácil no usarlo)Respuestas:
Para acceder al índice en este caso accedes al
name
atributo:Tenga en cuenta que si esto es realmente lo que está tratando de hacer, lo siguiente funciona y es mucho más rápido:
EDITAR
Si mira esta pregunta más de 3 años después, podría hacer lo siguiente:
pero asumiendo que no es tan trivial como esto, sea lo que sea lo que
rowFunc
esté haciendo realmente, debería buscar usar las funciones vectorizadas y luego usarlas contra el índice df:fuente
name
fuera una tupla con nombre en el caso de aMultindex
, de modo que se pueda consultar un nivel de índice específico por su nombre.Ya sea:
1.
row.name
dentro de laapply(..., axis=1)
llamada:2. con
iterrows()
(más lento)DataFrame.iterrows () le permite iterar sobre filas y acceder a su índice:
fuente
Para responder a la pregunta original: sí, puede acceder al valor de índice de una fila en
apply()
. Está disponible bajo la clavename
y requiere que usted especifiqueaxis=1
(porque la lambda procesa las columnas de una fila y no las filas de una columna).Ejemplo de trabajo (pandas 0.23.4):
fuente