Estou tentando acessar o índice de uma linha em uma função aplicada em todo o DataFrame
Pandas. Eu tenho algo assim:
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
e vou definir uma função que acessa elementos com uma determinada linha
def rowFunc(row):
return row['a'] + row['b'] * row['c']
Posso aplicá-lo assim:
df['d'] = df.apply(rowFunc, axis=1)
>>> df
a b c d
0 1 2 3 7
1 4 5 6 34
Impressionante! Agora, e se eu quiser incorporar o índice à minha função? O índice de qualquer linha dada DataFrame
antes de adicionar d
seria Index([u'a', u'b', u'c', u'd'], dtype='object')
, mas eu quero 0 e 1. Portanto, não posso simplesmente acessar row.index
.
Eu sei que poderia criar uma coluna temporária na tabela onde armazeno o índice, mas estou me perguntando se ela está armazenada no objeto de linha em algum lugar.
apply
? É muito mais lento do que realizar operações vetorizadas no próprio quadro. (Às vezes, aplicar é a maneira mais simples de fazer algo, e as considerações de desempenho costumam ser exageradas, mas para o seu exemplo específico é tão fácil de não usar.)Respostas:
Para acessar o índice, neste caso, você acessa o
name
atributo:Observe que, se isso é realmente o que você está tentando fazer, o seguinte funciona e é muito mais rápido:
EDITAR
Olhando para esta questão mais de 3 anos depois, você poderia apenas fazer:
mas assumindo que não seja tão trivial quanto isso, o que quer que você
rowFunc
esteja realmente fazendo, você deve procurar usar as funções vetorizadas e, em seguida, usá-las contra o índice df:fonte
name
fosse uma tupla nomeada no caso de aMultindex
, de modo que um nível de índice específico pudesse ser consultado por seu nome.Ou:
1. com
row.name
dentro daapply(..., axis=1)
chamada:2. com
iterrows()
(mais lento)DataFrame.iterrows () permite que você itere nas linhas e acesse seu índice:
fonte
Para responder à pergunta original: sim, você pode acessar o valor do índice de uma linha em
apply()
. Ele está disponível na chavename
e requer que você especifiqueaxis=1
(porque o lambda processa as colunas de uma linha e não as linhas de uma coluna).Exemplo de trabalho (pandas 0.23.4):
fonte