Qual é a diferença entre uma série de pandas e um DataFrame de coluna única?

168

Por que os pandas fazem uma distinção entre uma Seriese uma coluna DataFrame?
Em outras palavras: qual é a razão de existência da Seriesclasse?

Estou usando principalmente séries temporais com índice de data e hora, talvez isso ajude a definir o contexto.

saroele
fonte
Bem, eles são diferentes, obviamente, acho que você está se referindo a determinadas operações que ainda retornam um quadro de dados porque você possui apenas um quadro de dados de coluna única ou porque a operação resulta em um quadro de dados de coluna única. No entanto, ao selecionar uma única coluna, não há ambiguidade e isso se decompõe em uma Série. Você precisa mostrar um código de exemplo para explicar qual é o seu problema.
EdChum 25/09
Possivelmente relacionado: stackoverflow.com/questions/16782323/…
EdChum
6
A questão principal é que não vejo a necessidade de um objeto Series, com métodos diferentes.
Saroele # 25/14
Por um lado, há uma diferença de espaço para nome. As séries têm apenas um nome de nível superior, os quadros de dados têm um nível superior e um nome de coluna. Isso pode levar a diferenças significativas na sintaxe para processar / criar uma nova série versus uma nova coluna.
Johne
4
Tanto quanto posso dizer, essa pergunta ainda deve ser respondida. Mesmo que se possa pensar DataFrameem um dictde Series(embora essa não seja a implementação atual), ainda não está claro por que você retornaria um Seriesobjeto em vez de um DataFrame(ou seja, conceitualmente um dictcom uma entrada).
22418 Alex

Respostas:

190

Citando os documentos do Pandas

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

Estrutura de dados tabular bidimensional, mutável em tamanho e potencialmente heterogênea, com eixos rotulados (linhas e colunas). As operações aritméticas são alinhadas nos rótulos de linha e coluna. Pode ser pensado como um contêiner do tipo ditado para objetos da série. A estrutura de dados principal dos pandas.

Portanto, a série é a estrutura de dados para uma única coluna de aDataFrame , não apenas conceitualmente, mas literalmente, ou seja, os dados em a DataFramesão realmente armazenados na memória como uma coleção de Series.

Analogamente: precisamos de listas e matrizes, porque as matrizes são construídas com listas. Matrizes de linha única, embora equivalentes a listas na funcionalidade ainda não possam existir sem a (s) lista (s) da qual são compostas.

Ambos têm APIs extremamente semelhantes, mas você descobrirá que os DataFramemétodos sempre atendem à possibilidade de você ter mais de uma coluna. E, é claro, você sempre pode adicionar outro Series(ou objeto equivalente) a a DataFrame, enquanto a adição de um Seriesa outro Seriesenvolve a criação de um DataFrame.

PythonNut
fonte
2
Obrigado pela sua resposta. Minha pergunta foi inspirada por um bug no meu código quando uma seleção em um dataframe retornou uma série repentinamente e não consegui acessar o atributo de colunas. Eu não sou o único confuso: stackoverflow.com/questions/16782323/...
saroele
Entendo. Talvez ajudasse se eles tivessem um __repr__comportamento diferente , então você não pode confundi-los?
PythonNut
6
Você não pode concluir nada sobre a estrutura de dados internos real de um DataFramefrom Can be thought of as a dict-like container for Series objects. De fato, ele está atualmente armazenado como um BlockManager(que é um detalhe da implementação em que você não deve confiar).
timdiels
1
Ainda estou confuso, então quando eu usaria um quadro de dados de coluna única em vez de uma série?
Dhiraj suvarna
4
Posso ser pedante, mas não vejo a pergunta do OP de por que a série existe respondida. Eu vejo uma resposta descrevendo o relacionamento entre séries e quadros de dados, mas não uma resposta explicando por que devemos ter uma série como um tipo de dados separado, em vez de ser um caso especial de um quadro de dados (ou seja, com apenas uma coluna).
MightyCurious
14

do pandas doc http://pandas.pydata.org/pandas-docs/stable/dsintro.html Series é um array rotulado unidimensional capaz de armazenar qualquer tipo de dados. Para ler dados em forma de panda Series:

import pandas as pd
ds = pd.Series(data, index=index)

DataFrame é uma estrutura de dados rotulada bidimensional com colunas de tipos potencialmente diferentes.

import pandas as pd
df = pd.DataFrame(data, index=index)

Em ambos os índices acima está a lista

por exemplo: eu tenho um arquivo csv com os seguintes dados:

,country,popuplation,area,capital
BR,Brazil,10210,12015,Brasile
RU,Russia,1025,457,Moscow
IN,India,10458,457787,New Delhi

Para ler os dados acima como séries e quadro de dados:

import pandas as pd
file_data = pd.read_csv("file_path", index_col=0)
d = pd.Series(file_data.country, index=['BR','RU','IN'] or index =  file_data.index)

resultado:

>>> d
BR           Brazil
RU           Russia
IN            India

df = pd.DataFrame(file_data.area, index=['BR','RU','IN'] or index = file_data.index )

resultado:

>>> df
      area
BR   12015
RU     457
IN  457787
Umesh Kaushik
fonte
2
se alguém se esforçando para diminuir o voto, você também pode tentar mencionar um motivo?
Umesh Kaushik
2
Não reduzi o voto, mas seu código não funciona. Você pode alterar file_datapara brics, adicionar uma linha dos EUA ao csv e alterar ['BR'....'US']para brics.index. Talvez correto pupuplation.
RolfBly
@RolfBly: Obrigado por apontar esses erros. Foi bobagem da minha parte fazê-los. Eu os mudei. Obrigado! E com relação à leitura que apenas um exemplo eu peguei, portanto, valores aleatórios.
Umesh Kaushik
4

Series é um objeto unidimensional que pode conter qualquer tipo de dados, como números inteiros, flutuantes e strings, por exemplo

   import pandas as pd
   x = pd.Series([A,B,C]) 

0 A
1 B
2 C

A primeira coluna da série é conhecida como índice, ou seja, 0,1,2 a segunda coluna é seus dados reais, ou seja, A, B, C

DataFrames é um objeto bidimensional que pode conter séries, listas, dicionários

df=pd.DataFrame(rd(5,4),['A','B','C','D','E'],['W','X','Y','Z'])
syed irfan
fonte
2

Series é um array rotulado unidimensional capaz de armazenar qualquer tipo de dados (números inteiros, seqüências de caracteres, números de ponto flutuante, objetos Python, etc.). Os rótulos dos eixos são chamados coletivamente de índice. O método básico para criar uma série é chamar:

s = pd.Series(data, index=index)

DataFrame é uma estrutura de dados rotulada bidimensional com colunas de tipos potencialmente diferentes. Você pode pensar nisso como uma planilha ou tabela SQL ou um ditado para objetos Series.

 d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
 two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
 df = pd.DataFrame(d)
Yog
fonte
0

Importar dados de carros

import pandas as pd

cars = pd.read_csv('cars.csv', index_col = 0)

Aqui está a aparência do arquivo cars.csv.

Imprima a coluna drives_right como Série:

print(cars.loc[:,"drives_right"])

    US      True
    AUS    False
    JAP    False
    IN     False
    RU      True
    MOR     True
    EG      True
    Name: drives_right, dtype: bool

A versão de suporte único fornece uma Série Pandas, a versão de suporte duplo fornece um DataFrame do Pandas.

Imprimir coluna drives_right como DataFrame

print(cars.loc[:,["drives_right"]])

         drives_right
    US           True
    AUS         False
    JAP         False
    IN          False
    RU           True
    MOR          True
    EG           True

Adicionar uma série a outra série cria um DataFrame.

abhishek_7081
fonte
1
muito obrigado pela edição. Parece muito melhor agora. @Zoe
abhishek_7081