Eu construí uma condição que extrai exatamente uma linha do meu quadro de dados:
d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]
Agora eu gostaria de tirar um valor de uma coluna em particular:
val = d2['col_name']
Mas como resultado eu recebo um quadro de dados que contém uma linha e uma coluna (i.e. uma célula). Não é o que eu preciso. Eu preciso de um valor (um número de flutuação). Como eu posso fazer isso em pandas?
Se você tiver uma DataFrame com apenas uma linha, então acesse a primeira (apenas) linha como uma Série utilizando iloc
, e depois o valor utilizando o nome da coluna:
In [3]: sub_df
Out[3]:
A B
2 -0.133653 -0.030854
In [4]: sub_df.iloc[0]
Out[4]:
A -0.133653
B -0.030854
Name: 2, dtype: float64
In [5]: sub_df.iloc[0]['A']
Out[5]: -0.13365288513107493
Estes são acessos rápidos para os escalares.
In [15]: df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC'))
In [16]: df
Out[16]:
A B C
0 -0.074172 -0.090626 0.038272
1 -0.128545 0.762088 -0.714816
2 0.201498 -0.734963 0.558397
3 1.563307 -1.186415 0.848246
4 0.205171 0.962514 0.037709
In [17]: df.iat[0,0]
Out[17]: -0.074171888537611502
In [18]: df.at[0,'A']
Out[18]: -0.074171888537611502
Parecem mudanças após pandas 10.1/13.1
Fiz o upgrade de 10.1 para 13.1, antes do iloc não estar disponível.
Agora com 13.1, iloc[0]['label']
obtém um único array de valores ao invés de um escalar.
Assim:
lastprice=stock.iloc[-1]['Close']
Saída:
date
2014-02-26 118.2
name:Close, dtype: float64