Parece uma pergunta ridiculamente fácil ... mas não estou vendo a resposta fácil que estava esperando.
Então, como obtenho o valor na enésima linha de uma determinada coluna no Pandas? (Estou particularmente interessado na primeira linha, mas também estaria interessado em uma prática mais geral).
Por exemplo, digamos que eu queira extrair o valor 1.2 no Btime como uma variável.
Qual é o caminho certo para fazer isso?
df_test =
ATime X Y Z Btime C D E
0 1.2 2 15 2 1.2 12 25 12
1 1.4 3 12 1 1.3 13 22 11
2 1.5 1 10 6 1.4 11 20 16
3 1.6 2 9 10 1.7 12 29 12
4 1.9 1 1 9 1.9 11 21 19
5 2.0 0 0 0 2.0 8 10 11
6 2.4 0 0 0 2.4 10 12 15
df_test.head(1)
iria trabalhar, a forma mais geral é a utilizaçãoiloc
como respondidas por unutbu1.2
? ou a série de comprimento 1 fornecidadf_test.head(1)
, que também conterá o índice? Para obter apenas o valor façadf_test.head(1).item()
ou, emtolist()
seguida, corte.Respostas:
Para selecionar a
ith
linha, useiloc
:Para selecionar o i-ésimo valor na
Btime
coluna, você pode usar:Há uma diferença entre
df_test['Btime'].iloc[0]
(recomendado) edf_test.iloc[0]['Btime']
:Os DataFrames armazenam dados em blocos baseados em colunas (onde cada bloco tem um único tipo). Se você selecionar primeiro a coluna, uma exibição poderá ser retornada (o que é mais rápido que o retorno de uma cópia) e o dtype original é preservado. Por outro lado, se você selecionar primeiro a linha e se o DataFrame tiver colunas de diferentes tipos, o Pandas copiará os dados em uma nova série de tipos de objetos. Portanto, selecionar colunas é um pouco mais rápido que selecionar linhas. Assim, embora
df_test.iloc[0]['Btime']
funcione,df_test['Btime'].iloc[0]
é um pouco mais eficiente.Há uma grande diferença entre os dois quando se trata de atribuição.
df_test['Btime'].iloc[0] = x
afetadf_test
, masdf_test.iloc[0]['Btime']
pode não. Veja abaixo uma explicação do porquê. Como uma diferença sutil na ordem da indexação faz uma grande diferença no comportamento, é melhor usar a atribuição de indexação única:df.iloc[0, df.columns.get_loc('Btime')] = x
(recomendado):A maneira recomendada de atribuir novos valores a um DataFrame é evitar a indexação em cadeia e, em vez disso, use o método mostrado por andrew ,
ou
O último método é um pouco mais rápido, porque
df.loc
é necessário converter os rótulos de linha e coluna em índices posicionais; portanto, é necessário um pouco menos de conversão se você usardf.iloc
.df['Btime'].iloc[0] = x
funciona, mas não é recomendado:Embora isso funcione, ele está aproveitando a maneira como os DataFrames são implementados atualmente . Não há garantia de que o Pandas funcione dessa maneira no futuro. Em particular, está aproveitando o fato de que (atualmente)
df['Btime']
sempre retorna uma visualização (não uma cópia), para quedf['Btime'].iloc[n] = x
possa ser usado para atribuir um novo valor no enésimo local daBtime
coluna dedf
.Como o Pandas não oferece garantias explícitas sobre quando os indexadores retornam uma visualização versus uma cópia, as atribuições que usam indexação encadeada geralmente sempre aumentam
SettingWithCopyWarning
, embora nesse caso a atribuição consiga modificardf
:df.iloc[0]['Btime'] = x
não funciona:Por outro lado, a atribuição com
df.iloc[0]['bar'] = 123
não funciona porquedf.iloc[0]
está retornando uma cópia:Aviso : eu havia sugerido anteriormente
df_test.ix[i, 'Btime']
. Mas isso não garante que você ofereça oith
valor, poisix
tenta indexar por rótulo antes de tentar indexar por posição . Portanto, se o DataFrame tiver um índice inteiro que não esteja na ordem classificada, começando em 0, usarix[i]
retornará a linha rotuladai
em vez daith
linha. Por exemplo,fonte
df_test.iloc[0]['Btime']
funcione,df_test.iloc['Btime'][0]
é um pouco mais eficiente.df['Btime'].iloc[0]
preferidodf['Btime'].values[0]
? Eu posso ver na documentação que diz "Aviso: recomendamos o uso de Series.array ou Series.to_numpy (), dependendo se você precisa de uma referência aos dados subjacentes ou a uma matriz NumPy". mas não sei exatamente o que isso significaObserve que a resposta de @unutbu estará correta até que você defina o valor como algo novo, e não funcionará se o seu quadro de dados for uma visualização.
Outra abordagem que funcionará consistentemente com a configuração e a obtenção é:
fonte
Outra maneira de fazer isso:
Dessa maneira, parece ser mais rápido do que usar
.iloc
:fonte
df.iloc[0].head(1)
- Primeiro conjunto de dados apenas da primeira linha inteira.df.iloc[0]
- Primeira linha inteira na coluna.fonte
De uma maneira geral, se você quiser pegar as primeiras N linhas da coluna J
pandas dataframe
da melhor maneira de fazer isso é:fonte
Para obter, por exemplo, o valor da coluna 'test' e da linha 1, funciona como
como apenas
df[['test']].values[0]
devolve uma matrizfonte
Outra maneira de obter a primeira linha e preservar o índice:
fonte