Qual è la differenza tra una serie di panda e un DataFrame a colonna singola?


168

Perché i panda fanno una distinzione tra una Seriese una singola colonna DataFrame?
In altre parole: qual è il motivo dell'esistenza della Seriesclasse?

Sto principalmente usando le serie temporali con indice datetime, forse questo aiuta a impostare il contesto.


Beh, ovviamente sono diversi, penso che ti riferisci a determinate operazioni che restituiscono comunque un frame di dati o perché hai solo un frame di dati a colonna singola o perché l'operazione si traduce in un frame di dati a colonna singola. Tuttavia, quando si seleziona una singola colonna non vi è alcuna ambiguità e questo si decompone in una serie. Devi mostrare un codice di esempio per spiegare qual è il tuo problema.
EdChum,


6
Il problema principale è che non vedo la necessità di un oggetto Series, con metodi diversi.
saroele,

Per uno, c'è una differenza nello spazio dei nomi. Le serie hanno solo un nome di livello superiore, i frame di dati hanno un nome di livello superiore e un nome di colonna. Ciò può comportare differenze significative nella sintassi per l'elaborazione / creazione di una nuova serie rispetto a una nuova colonna.
Giovanni,

4
Per quanto posso dire, questa domanda dovrebbe ancora avere una risposta. Anche se si può pensare di DataFramecome dictdi Series(anche se questo non è l'implementazione corrente), non è ancora chiaro il motivo per cui si sarebbe mai restituire un Seriesoggetto invece di una DataFrame(cioè concettualmente una dictcon una voce).
Alex,

Risposte:


190

Citando i documenti di Panda

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

Struttura dati tabulare bidimensionale mutabile in dimensioni, potenzialmente eterogenea con assi etichettati (righe e colonne). Le operazioni aritmetiche si allineano su entrambe le etichette di riga e colonna. Può essere pensato come un contenitore simile a una dict per gli oggetti della serie. La struttura dati panda primaria.

Quindi, la serie è la struttura di dati per una singola colonna di aDataFrame , non solo concettualmente, ma letteralmente, cioè i dati in a DataFramesono effettivamente memorizzati nella memoria come una raccolta di Series.

Analogamente: abbiamo bisogno sia di liste che di matrici, poiché le matrici sono costruite con liste. Matrici a riga singola, sebbene equivalenti alle liste in funzionalità non possono ancora esistere senza le liste di cui sono composte.

Entrambi hanno API estremamente simili, ma scoprirai che i DataFramemetodi soddisfano sempre la possibilità di avere più di una colonna. E, naturalmente, puoi sempre aggiungere un altro Series(o oggetto equivalente) a a DataFrame, mentre aggiungere a Seriesa un altro Seriesimplica la creazione di a DataFrame.


2
Grazie per la tua risposta. La mia domanda è stata ispirata da un bug nel mio codice quando una selezione su un frame di dati ha restituito improvvisamente una serie e non ho potuto accedere all'attributo colonne. Io non sono l'unico confuso: stackoverflow.com/questions/16782323/...
saroele

Vedo. Forse sarebbe d'aiuto se avessero un __repr__comportamento diverso , quindi non puoi confonderli?
PythonNut,

6
Non è possibile concludere nulla sull'attuale struttura interna dei dati di un DataFrameda Can be thought of as a dict-like container for Series objects. In effetti, attualmente è archiviato come BlockManager(che è un dettaglio di implementazione su cui non si dovrebbe fare affidamento).
timdiels,

1
Sono ancora confuso, quindi quando dovrei usare un frame di dati a colonna singola anziché una serie?
dhiraj suvarna,

4
Potrei essere pedante, ma non vedo la risposta dell'OP del perché la serie esiste. Vedo una risposta che descrive la relazione tra serie e frame di dati, ma non una risposta che spiega perché dovremmo voler avere una serie come tipo di dati separato anziché essere un caso speciale di un frame di dati (ovvero uno con una sola colonna).
MightyCurious

14

dal documento panda http://pandas.pydata.org/pandas-docs/stable/dsintro.html La serie è un array con etichetta unidimensionale in grado di contenere qualsiasi tipo di dati. Per leggere i dati in forma di serie di panda:

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

DataFrame è una struttura di dati con etichetta bidimensionale con colonne di tipi potenzialmente diversi.

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

In entrambi gli indici sopra è riportato l'elenco

ad esempio: ho un file CSV con i seguenti dati:

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

Per leggere i dati sopra come serie e frame di dati:

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)

produzione:

>>> d
BR           Brazil
RU           Russia
IN            India

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

produzione:

>>> df
      area
BR   12015
RU     457
IN  457787

2
se qualcuno si sforza di sottovalutare, potresti anche provare a menzionare un motivo?
Umesh Kaushik il

2
Non ho effettuato il downgrade, ma il tuo codice non funziona. Potresti voler cambiare file_datain brics, aggiungere una linea americana al csv e cambiare ['BR'....'US']in brics.index. Forse corretto pupuplation.
RolfBly,

@RolfBly: grazie per aver sottolineato quegli errori. È stato sciocco da parte mia farli. Li ho cambiati. Grazie! E riguardo alla lettura che solo un esempio ho preso quindi valori casuali.
Umesh Kaushik,

4

La serie è un oggetto monodimensionale che può contenere qualsiasi tipo di dati come numeri interi, float e stringhe, ad es

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

0 A
1 B
2 C

La prima colonna della serie è nota come indice, ovvero 0,1,2, mentre la seconda colonna contiene i dati effettivi, ovvero A, B, C

DataFrames è un oggetto bidimensionale che può contenere serie, elenchi, dizionari

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

2

La serie è un array con etichetta unidimensionale in grado di contenere qualsiasi tipo di dati (numeri interi, stringhe, numeri in virgola mobile, oggetti Python, ecc.). Le etichette degli assi vengono definite collettivamente come indice. Il metodo di base per creare una serie è chiamare:

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

DataFrame è una struttura di dati con etichetta bidimensionale con colonne di tipi potenzialmente diversi. Puoi pensarlo come un foglio di calcolo o una tabella SQL o un motto di oggetti 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)

0

Importa dati auto

import pandas as pd

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

Ecco come appare il file cars.csv.

Stampa la colonna drives_right come serie:

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

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

La versione a staffa singola fornisce una serie Pandas, la versione a staffa doppia dà un Pandas DataFrame.

Stampa la colonna drives_right come DataFrame

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

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

L'aggiunta di una serie a un'altra serie crea un DataFrame.


1
grazie mille per la modifica. Ora sembra molto meglio. @Zoe
abhishek_7081
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.