Solución:
Para acceder al índice en este caso accede al name
atributo:
In [182]:
df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
def rowFunc(row):
return row['a'] + row['b'] * row['c']
def rowIndex(row):
return row.name
df['d'] = df.apply(rowFunc, axis=1)
df['rowIndex'] = df.apply(rowIndex, axis=1)
df
Out[182]:
a b c d rowIndex
0 1 2 3 7 0
1 4 5 6 34 1
Tenga en cuenta que si esto es realmente lo que está tratando de hacer, lo siguiente funciona y es mucho más rápido:
In [198]:
df['d'] = df['a'] + df['b'] * df['c']
df
Out[198]:
a b c d
0 1 2 3 7
1 4 5 6 34
In [199]:
%timeit df['a'] + df['b'] * df['c']
%timeit df.apply(rowIndex, axis=1)
10000 loops, best of 3: 163 µs per loop
1000 loops, best of 3: 286 µs per loop
EDITAR
Si mira esta pregunta más de 3 años después, podría hacer lo siguiente:
In[15]:
df['d'],df['rowIndex'] = df['a'] + df['b'] * df['c'], df.index
df
Out[15]:
a b c d rowIndex
0 1 2 3 7 0
1 4 5 6 34 1
pero suponiendo que no sea tan trivial como esto, sea cual sea tu rowFunc
realmente está haciendo, debería buscar usar las funciones vectorizadas, y luego usarlas contra el índice df:
In[16]:
df['newCol'] = df['a'] + df['b'] + df['c'] + df.index
df
Out[16]:
a b c d rowIndex newCol
0 1 2 3 7 0 6
1 4 5 6 34 1 16
Cualquiera:
1. con row.name
dentro de apply(..., axis=1)
llama:
df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'], index=['x','y'])
a b c
x 1 2 3
y 4 5 6
df.apply(lambda row: row.name, axis=1)
x x
y y
2. con iterrows()
(Más lento)
DataFrame.iterrows () le permite iterar sobre filas y acceder a su índice:
for idx, row in df.iterrows():
...
Para responder a la pregunta original: sí, puede acceder al valor de índice de una fila en apply()
. Está disponible bajo la clave name
y requiere que especifiques axis=1
(porque la lambda procesa las columnas de una fila y no las filas de una columna).
Ejemplo de trabajo (pandas 0.23.4):
>>> import pandas as pd
>>> df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df.set_index('a', inplace=True)
>>> df
b c
a
1 2 3
4 5 6
>>> df['index_x10'] = df.apply(lambda row: 10*row.name, axis=1)
>>> df
b c index_x10
a
1 2 3 10
4 5 6 40