No Pandas, quando seleciono um rótulo que tem apenas uma entrada no índice, recebo uma série, mas quando seleciono uma entrada que tem mais de uma entrada, recebo um quadro de dados.
Por que é que? Existe uma maneira de garantir que sempre recebo um quadro de dados?
In [1]: import pandas as pd
In [2]: df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3])
In [3]: type(df.loc[3])
Out[3]: pandas.core.frame.DataFrame
In [4]: type(df.loc[1])
Out[4]: pandas.core.series.Series
KeyError
quando tento.loc[[nonexistent_label]]
..loc
é muito mais lento do que sem ela. Para ser ainda legível, mas também muito mais rápido, use melhordf.loc[1:1]
Você tem um índice com três itens de índice
3
. Por esse motivodf.loc[3]
, retornará um dataframe.O motivo é que você não especifica a coluna. Então
df.loc[3]
seleciona três itens de todas as colunas (que é coluna0
), enquantodf.loc[3,0]
retornará uma Série. Por exemplo,df.loc[1:2]
também retorna um dataframe, porque você divide as linhas.Selecionar uma única linha (as
df.loc[1]
) retorna uma Série com os nomes das colunas como o índice.Se você quiser ter certeza de sempre ter um DataFrame, pode fazer um slice como
df.loc[1:1]
. Outra opção é a indexação booleana (df.loc[df.index==1]
) ou o método take (df.take([0])
, mas este local usado não é rótulos!).fonte
O TLDR
Ao usar
loc
df.loc[:]
= Dataframedf.loc[int]
= Dataframe se você tiver mais de uma coluna e Series se você tiver apenas 1 coluna no dataframedf.loc[:, ["col_name"]]
= Dataframedf.loc[:, "col_name"]
= SérieNão use
loc
df["col_name"]
= Sériedf[["col_name"]]
= Dataframefonte
Use
df['columnName']
para obter uma série edf[['columnName']]
para obter um Dataframe.fonte
Você escreveu em um comentário à resposta de joris:
Uma única linha não é convertida em uma série.
Ele é uma série:
No, I don't think so, in fact; see the edit
O modelo de dados dos objetos Pandas foi escolhido assim. A razão certamente está no fato de garantir algumas vantagens que não conheço (não entendi bem a última frase da citação, talvez seja o motivo)
.
Edit: Eu não concordo comigo
A trama de dados não pode ser composto de elementos que iria ser Series, porque o código a seguir dá o mesmo tipo "Series", bem como para uma linha como para uma coluna:
resultado
Portanto, não faz sentido fingir que um DataFrame é composto de Séries, porque o que essas Séries seriam: colunas ou linhas? Pergunta e visão estúpidas.
.
Então o que é um DataFrame?
Na versão anterior desta resposta, fiz esta pergunta, tentando encontrar a resposta para a
Why is that?
parte da pergunta do OP e a interrogação semelhantesingle rows to get converted into a series - why not a data frame with one row?
em um de seus comentários,enquanto a
Is there a way to ensure I always get back a data frame?
parte foi respondida por Dan Allan.Então, como os documentos dos Pandas citados acima dizem que as estruturas de dados dos pandas são mais bem vistas como contêineres de dados dimensionais inferiores, pareceu-me que a compreensão do porquê seria encontrada nas características da natureza das estruturas DataFrame.
No entanto, percebi que este conselho citado não deve ser tomado como uma descrição precisa da natureza das estruturas de dados do Pandas.
Este conselho não significa que um DataFrame seja um contêiner de Series.
Expressa que a representação mental de um DataFrame como um container de Séries (sejam linhas ou colunas conforme a opção considerada em um momento de raciocínio) é uma boa forma de considerar DataFrames, mesmo que não seja estritamente o caso na realidade. "Bom" significa que esta visão permite usar DataFrames com eficiência. Isso é tudo.
.
Então, o que é um objeto DataFrame?
A classe DataFrame produz instâncias que possuem uma estrutura particular originada na classe base NDFrame , ela própria derivada da classe base PandasContainer que também é uma classe pai da classe Series .
Observe que isso é correto para Pandas até a versão 0.12. Na próxima versão 0.13, Series derivará também da classe NDFrame apenas.
resultado
Portanto, meu entendimento é que uma instância de DataFrame tem certos métodos que foram criados para controlar a maneira como os dados são extraídos de linhas e colunas.
As maneiras como esses métodos de extração funcionam são descritas nesta página: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
Encontramos nele o método fornecido por Dan Allan e outros métodos.
Por que esses métodos de extração foram elaborados da forma como eram?
Certamente porque foram avaliados como os que apresentam melhores possibilidades e facilidade na análise dos dados.
É exatamente o que está expresso nesta frase:
O porquê da extração de dados de uma instância de DataFRame não está em sua estrutura, mas no porquê dessa estrutura. Eu acho que a estrutura e o funcionamento da estrutura de dados do Pandas foram esculpidos para serem o mais intuitivos intelectualmente possíveis, e que para entender os detalhes, é preciso ler o blog de Wes McKinney.
fonte
Se o objetivo for obter um subconjunto do conjunto de dados usando o índice, é melhor evitar o uso de
loc
ouiloc
. Em vez disso, você deve usar uma sintaxe semelhante a esta:fonte
Se você também selecionar o índice do dataframe, o resultado pode ser um DataFrame ou uma Série ou pode ser uma Série ou um escalar (valor único).
Esta função garante que você sempre obtenha uma lista de sua seleção (se o df, índice e coluna forem válidos):
fonte