Was ist der Unterschied zwischen einer Pandas-Serie und einem einspaltigen DataFrame?

168

Warum unterscheiden Pandas zwischen einer Seriesund einer einzelnen Spalte DataFrame?
Mit anderen Worten: Was ist der Grund für die Existenz der SeriesKlasse?

Ich verwende hauptsächlich Zeitreihen mit Datum / Uhrzeit-Index. Vielleicht hilft das, den Kontext festzulegen.

saroele
quelle
Nun, sie unterscheiden sich offensichtlich. Ich denke, Sie beziehen sich auf bestimmte Operationen, die immer noch einen Datenrahmen zurückgeben, entweder weil Sie nur einen einzelnen Spalten-Datenrahmen haben oder weil die Operation zu einem einzelnen Spalten-Datenrahmen führt. Bei der Auswahl einer einzelnen Spalte besteht jedoch keine Mehrdeutigkeit, und diese wird in eine Reihe zerlegt. Sie müssen Beispielcode anzeigen, um Ihr Problem zu erklären.
EdChum
Möglicherweise verwandt: stackoverflow.com/questions/16782323/…
EdChum
6
Das Hauptproblem ist, dass ich keine Notwendigkeit für ein Serienobjekt mit unterschiedlichen Methoden sehe.
Saroele
Zum einen gibt es einen Namespace-Unterschied. Serien haben nur einen Namen der obersten Ebene, Datenrahmen haben einen Namen der obersten Ebene und einen Spaltennamen. Dies kann zu erheblichen Unterschieden in der Syntax für die Verarbeitung / Erstellung einer neuen Reihe gegenüber einer neuen Spalte führen.
JohnE
4
Soweit ich das beurteilen kann, sollte diese Frage noch beantwortet werden. Auch wenn man denken kann , DataFrameals ein dictvon Series(obwohl das nicht die aktuelle Implementierung ist), ist es noch unklar , warum Sie jemals eine Rückkehr würde SeriesObjekt anstelle eines DataFrame(dh vom Konzept her eine dictmit einem Eintrag).
Alex

Antworten:

190

Zitieren der Pandas-Dokumente

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

Zweidimensionale größenveränderliche, möglicherweise heterogene tabellarische Datenstruktur mit beschrifteten Achsen (Zeilen und Spalten). Arithmetische Operationen werden sowohl auf Zeilen- als auch auf Spaltenbeschriftungen ausgerichtet. Kann als diktatartiger Container für Serienobjekte betrachtet werden. Die primäre Pandas-Datenstruktur.

Die Serie ist also die Datenstruktur für eine einzelne Spalte von aDataFrame , nicht nur konzeptionell, sondern wörtlich, dh die Daten in a DataFramewerden tatsächlich als Sammlung von im Speicher gespeichert Series.

Analog: Wir brauchen sowohl Listen als auch Matrizen, weil Matrizen mit Listen erstellt werden. Einzeilige Matrizen sind zwar gleichbedeutend mit Listen in der Funktionalität, können jedoch ohne die Liste (n), aus denen sie bestehen, nicht existieren.

Beide haben extrem ähnliche APIs, aber Sie werden feststellen, dass DataFrameMethoden immer die Möglichkeit berücksichtigen, dass Sie mehr als eine Spalte haben. Und natürlich können Sie einem jederzeit ein anderes Series(oder ein gleichwertiges Objekt) DataFramehinzufügen, während das Hinzufügen eines Serieszu einem anderen Seriesdas Erstellen eines DataFrame.

PythonNut
quelle
2
Danke für deine Antwort. Meine Frage wurde von einem Fehler in meinem Code inspiriert, als eine Auswahl in einem Datenrahmen plötzlich stattdessen eine Reihe zurückgab und ich nicht auf das Spaltenattribut zugreifen konnte. Ich bin nicht der einzige, der verwirrt ist: stackoverflow.com/questions/16782323/…
saroele
Aha. Vielleicht würde es helfen, wenn sie sich anders __repr__verhalten würden, also können Sie sie nicht verwechseln?
PythonNut
6
Sie können nichts über die tatsächliche interne Datenstruktur eines DataFramevon schließen Can be thought of as a dict-like container for Series objects. Tatsächlich wird es derzeit als gespeichert BlockManager(ein Implementierungsdetail, auf das Sie sich nicht verlassen sollten).
Timdiels
1
Ich bin immer noch verwirrt. Wann würde ich einen einspaltigen Datenrahmen anstelle einer Serie verwenden?
Dhiraj Suvarna
4
Ich mag pedantisch sein, aber ich sehe keine Antwort auf die Frage des OP, warum es Serien gibt. Ich sehe eine Antwort, die die Beziehung zwischen Serien und Datenrahmen beschreibt, aber keine Antwort, die erklärt, warum wir eine Serie als separaten Datentyp haben möchten, anstatt ein Sonderfall eines Datenrahmens zu sein (nämlich einen mit nur einer Spalte).
MightyCurious
14

aus dem Pandas-Dokument http://pandas.pydata.org/pandas-docs/stable/dsintro.html Die Serie ist ein eindimensional beschriftetes Array, das jeden Datentyp aufnehmen kann. So lesen Sie Daten in Form von Panda-Serien:

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

DataFrame ist eine zweidimensional beschriftete Datenstruktur mit Spalten potenziell unterschiedlicher Typen.

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

In beiden oben genannten Index ist Liste

Zum Beispiel: Ich habe eine CSV-Datei mit folgenden Daten:

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

So lesen Sie die obigen Daten als Serie und Datenrahmen:

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)

Ausgabe:

>>> d
BR           Brazil
RU           Russia
IN            India

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

Ausgabe:

>>> df
      area
BR   12015
RU     457
IN  457787
Umesh Kaushik
quelle
2
Könnten Sie auch versuchen, einen Grund zu nennen, wenn sich jemand bemüht, abzustimmen?
Umesh Kaushik
2
Ich habe nicht abgelehnt, aber Ihr Code funktioniert nicht. Sie können geändert werden soll , file_dataum bricseine US - Linie zum csv hinzufügen und ändern ['BR'....'US']zu brics.index. Vielleicht richtig pupuplation.
RolfBly
@RolfBly: Danke, dass du auf diese Fehler hingewiesen hast. Es war dumm von meiner Seite, sie zu machen. Ich habe sie geändert. Danke dir! Und in Bezug auf das Lesen dieses Beispiels habe ich daher zufällige Werte genommen.
Umesh Kaushik
4

Serie ist ein eindimensionales Objekt, das jeden Datentyp wie Ganzzahlen, Gleitkommazahlen und Zeichenfolgen enthalten kann, z

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

0 A
1 B
2 C

Die erste Spalte der Serie ist als Index bekannt, dh 0,1,2. Die zweite Spalte enthält Ihre tatsächlichen Daten, dh A, B, C.

DataFrames ist ein zweidimensionales Objekt, das Serien, Listen und Wörterbücher enthalten kann

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

Series ist ein eindimensional beschriftetes Array, das jeden Datentyp (Ganzzahlen, Zeichenfolgen, Gleitkommazahlen, Python-Objekte usw.) enthalten kann. Die Achsenbeschriftungen werden zusammen als Index bezeichnet. Die grundlegende Methode zum Erstellen einer Serie besteht darin, Folgendes aufzurufen:

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

DataFrame ist eine zweidimensional beschriftete Datenstruktur mit Spalten potenziell unterschiedlicher Typen. Sie können sich das wie eine Tabelle, eine SQL-Tabelle oder ein Diktat von Serienobjekten vorstellen.

 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
quelle
0

Autodaten importieren

import pandas as pd

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

So sieht die Datei cars.csv aus.

Drucken Sie die Spalte drive_right als Serie aus:

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

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

Die Single-Bracket-Version bietet eine Pandas-Serie, die Double-Bracket-Version einen Pandas DataFrame.

Drucken Sie die Spalte drive_right als DataFrame aus

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

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

Durch Hinzufügen einer Serie zu einer anderen Serie wird ein DataFrame erstellt.

abhishek_7081
quelle
1
Vielen Dank für die Bearbeitung. Es sieht jetzt viel besser aus. @Zoe
abhishek_7081