Como obter um valor de uma célula de um quadro de dados?

344

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 pegar um valor de uma coluna específica:

val = d2['col_name']

Mas, como resultado, recebo um quadro de dados que contém uma linha e uma coluna ( ou seja, uma célula). Não é o que eu preciso. Eu preciso de um valor (um número flutuante). Como posso fazer isso em pandas?

romano
fonte
11
Se você tentou algumas dessas respostas, mas acabou com a SettingWithCopyWarning, consulte esta postagem para obter uma explicação do aviso e possíveis soluções / soluções alternativas.
cs95

Respostas:

428

Se você tiver um DataFrame com apenas uma linha, acesse a primeira (apenas) linha como uma Série usando iloce, em seguida, o valor usando 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
Andy Hayden
fonte
11
@ Sophologist olhando para isso, não faço ideia. A pergunta é um pouco estranha, mas parece que a primeira metade é irrelevante para a segunda. ( atÉ uma resposta muito bom, embora eu acho estranho é como ix:))
Andy Hayden
9
@ Sophologist Concordo que é ridículo que isso seja necessário. Também não funciona quando você tenta passar as condicionais em linha; my_df.loc[my_df['Col1'] == foo]['Col2']ainda retorna um objeto do tipo<class 'pandas.core.series.Series'>
user5359531 18/11
15
Observe que esta solução retorna uma série, não um valor!
Atte Juvonen
11
@AtteJuvonen Isso depende se você possui duplicatas no seu índice / colunas (observe em / iat gera uma exceção com colunas duplicadas, registrará um problema).
Andy Hayden
11
esquisito. Eu continuo lendo loc é para nomes e iloc é para números inteiros, mas aqui é iloc para número inteiro e nome
mLstudent33 13/03/03
205

Estes são acessos rápidos para 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
Jeff
fonte
9
Eu gosto muito dessa resposta. Mas, enquanto você pode fazer .iloc[-1]['A']você não pode fazer at[-1,'A']para obter a última entrada de linha
Hartmut
3
essa deve ser a resposta, porque não copiamos na memória uma linha inútil para inserir apenas um elemento.
bormat
3
@hartmut Você sempre pode apenas fazerat[df.index[-1],'A']
cs95
105

Você pode transformar seu quadro de dados 1x1 em uma matriz numpy e acessar o primeiro e único valor dessa matriz:

val = d2['col_name'].values[0]
Guillaume
fonte
10
Melhore a qualidade da sua resposta com um pouco mais de explicação.
Franck Gamess
Edite sua resposta inicial com isso antes de criar um comentário. Obrigado
Franck Gamess
2
Eu prefiro esse método e o uso com frequência. .get_values()[0]Também costumava usar .
aaronpenne
3
Eu acho que esta é a melhor resposta, pois não retorna um pandas.series, e é a mais simples.
Sean McCarthy
Que vantagem isso tem sobre os métodos fornecidos pelo Pandas?
AMC
28

Está usando a maioria das respostas, o ilocque é bom para a seleção por posição.

Se você precisar de seleção por rótulo, loc seria mais conveniente.

Para obter um valor explicitamente (equivale a df.get_value obsoleto ('a', 'A'))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932
Shihe Zhang
fonte
18

Eu precisava do valor de uma célula, selecionada pelos nomes de colunas e índices. Esta solução funcionou para mim:

original_conversion_frequency.loc[1,:].values[0]

Natacha
fonte
16

Parece mudanças após os pandas 10.1 / 13.1

Atualizei de 10.1 para 13.1, antes que o iloc não esteja disponível.

Agora com 13.1, iloc[0]['label'] obtém uma matriz de valor único em vez de escalar.

Como isso:

lastprice=stock.iloc[-1]['Close']

Resultado:

date
2014-02-26 118.2
name:Close, dtype: float64
tempo é amor
fonte
Eu acho que esse deve ser o caso apenas de séries com entradas duplicadas ... na verdade, eu não vejo isso, você poderia dar um pequeno exemplo para demonstrar isso?
Andy Hayden
Eu usei o pandas 13.x, iloc [] [] ou iloc [,] produzindo um escalar. apenas o iloc não está trabalhando com índice negativo, como -1
timeislove 10/10
Se você puder dar um exemplo de brinquedo demonstrando isso na resposta, seria realmente útil!
Andy Hayden
5

As opções mais rápidas / fáceis que encontrei são as seguintes. 501 representa o índice de linha.

df.at[501,'column_name']
df.get_value(501,'column_name')
jroakes
fonte
5
get_valueestá obsoleto agora (v0.21.0 RC1 (13 de outubro de 2017)) A referência está aqui .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang
4

Para pandas 0.10, onde não pode ilocser navegado, filtre a DFe obtenha os dados da primeira linha da coluna VALUE:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

se houver mais de uma linha filtrada, obtenha o valor da primeira linha. Haverá uma exceção se o filtro resultar em um quadro de dados vazio.

Sergey Sergienko
fonte
3
get_valuefoi descontinuado agora (v0.21.0 RC1 (13 de outubro de 2017)) A referência está aqui .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang
Mas iatou atnão é possível obter o valor com base no nome da coluna.
sivabudh
4

Não tenho certeza se essa é uma boa prática, mas eu notei que também posso obter o valor colocando a série como float.

por exemplo

rate

3 0,042679

Nome: Unemployment_rate, dtype: float64

float(rate)

0,0426789

Michael Wei
fonte
Isso funciona com uma série de vários elementos também?
precisa
1

Não precisa ser complicado:

val = df.loc[df.wd==1, 'col_name'].values[0]
Eduardo Freitas
fonte
-1
df_gdp.columns

Índice ([u'Country ', u'Country Code', u'Indicator Name ', u'Indicator Code', u'1960 ', u'1961', u'1962 ', u'1963', u'1964 ' , u1965 ', u1966', u1967 ', u1968', u1969 ', u1970', u1971 ', u1972', u1973 ', u1974' , u'1975 ', u'1976', u'1977 ', u'1978', u'1979 ', u'1980', u'1981 ', u'1982', u'1983 ', u'1984' , u'1985 ', u'1986', u'1987 ', u'1988', u'1989 ', u'1990', u'1991 ', u'1992', u'1993 ', u'1994' , u'1995 ', u'1996', u'1997 ', u'1998', u'1999 ', u'2000',u'2001 ', u'2002', u'2003 ', u'2004', u'2005 ', u'2006', u'2007 ', u'2008', u'2009 ', u'2010', u'2011 ', u'2012', u'2013 ', u'2014', u'2015 ', u'2016'], dtype = 'objeto')

df_gdp[df_gdp["Country Code"] == "USA"]["1996"].values[0]

8100000000000.0

Su Tingxuan
fonte
4
Isso é uma resposta ou uma pergunta?
Vega
4
Bem-vindo ao Stack Overflow! Obrigado pelo snippet de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo , descrevendo por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
sepehr
Apesar dos votos negativos, essa resposta realmente me ajudou.
CONvid19 21/03