Jaka jest różnica między serią pandy a pojedynczą kolumną DataFrame?

168

Dlaczego pandy rozróżniają Serieskolumnę a od pojedynczej kolumny DataFrame?
Innymi słowy: jaka jest przyczyna istnienia Seriesklasy?

Używam głównie szeregów czasowych z indeksem daty i godziny, może to pomaga ustawić kontekst.

saroele
źródło
Cóż, są różne, oczywiście, myślę, że odnosisz się do pewnych operacji, które nadal zwracają ramkę danych, albo dlatego, że masz tylko pojedynczą kolumnę Dataframe, albo dlatego, że operacja skutkuje pojedynczą kolumną Dataframe. Jednak podczas wybierania pojedynczej kolumny nie ma niejednoznaczności, a to rozkłada się na Seria. Musisz pokazać przykładowy kod, aby wyjaśnić, na czym polega problem.
EdChum
Prawdopodobnie powiązane: stackoverflow.com/questions/16782323/…
EdChum
6
Głównym problemem jest to, że nie widzę potrzeby stosowania obiektu Series z różnymi metodami.
saroele
Po pierwsze, istnieje różnica przestrzeni nazw. Serie mają tylko nazwę najwyższego poziomu, ramki danych mają najwyższy poziom i nazwę kolumny. Może to prowadzić do znacznych różnic w składni przetwarzania / tworzenia nowej serii w porównaniu z nową kolumną.
JohnE
4
O ile wiem, na to pytanie należy odpowiedzieć. Chociaż można myśleć o DataFramea dictof Series(chociaż nie jest to obecna implementacja), nadal nie jest jasne, dlaczego kiedykolwiek miałbyś zwrócić Seriesobiekt zamiast a DataFrame(tj. Koncepcyjnie a dictz jednym wpisem).
Alex

Odpowiedzi:

190

Cytując dokumentację Pandas

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

Dwuwymiarowa, zmienna pod względem rozmiaru, potencjalnie heterogeniczna struktura danych tabelarycznych z oznaczonymi osiami (wierszami i kolumnami). Operacje arytmetyczne są wyrównane na etykietach wierszy i kolumn. Można go traktować jako kontener na obiekty serii. Podstawowa struktura danych pand.

Tak więc seria jest strukturą danych dla pojedynczej kolumny aDataFrame , nie tylko koncepcyjnie, ale dosłownie, tj. Dane w a DataFramesą faktycznie przechowywane w pamięci jako zbiór Series.

Analogicznie: potrzebujemy zarówno list, jak i macierzy, ponieważ macierze są zbudowane z list. Matricies jednorzędowe, mimo że równoważne listom pod względem funkcjonalności, nadal nie mogą istnieć bez list, z których się składają.

Oba mają bardzo podobne interfejsy API, ale przekonasz się, że DataFramemetody zawsze uwzględniają możliwość, że masz więcej niż jedną kolumnę. Oczywiście zawsze możesz dodać inny Series(lub równoważny obiekt) do a DataFrame, podczas gdy dodanie a Seriesdo innego Serieswiąże się z utworzeniem pliku DataFrame.

PythonNut
źródło
2
Dziękuję za odpowiedź. Moje pytanie zostało zainspirowane błędem w moim kodzie, gdy wybór w ramce danych nagle zwrócił zamiast tego serię i nie mogłem uzyskać dostępu do atrybutu kolumn. Nie tylko ja jestem zdezorientowany: stackoverflow.com/questions/16782323/…
saroele
Widzę. Może pomogłoby, gdyby zachowywali się inaczej __repr__, więc nie można ich pomylić?
PythonNut
6
Nie można wyciągnąć żadnych wniosków na temat rzeczywistej wewnętrznej struktury danych DataFramez Can be thought of as a dict-like container for Series objects. W rzeczywistości jest obecnie przechowywany jako BlockManager(co jest szczegółem implementacji, na którym nie powinieneś polegać).
timdiels
1
Nadal jestem zdezorientowany, więc kiedy powinienem użyć pojedynczej kolumny danych zamiast serii?
dhiraj suvarna
4
Mogę być pedantyczny, ale nie widzę odpowiedzi na pytanie OP, DLACZEGO seria istnieje. Widzę odpowiedź opisującą związek między szeregami a ramkami danych, ale nie odpowiedź wyjaśniającą, dlaczego powinniśmy chcieć mieć serię jako oddzielny typ danych, w przeciwieństwie do specjalnego przypadku ramki danych (mianowicie jednej z tylko jedną kolumną).
MightyCurious
14

z dokumentu pandy http://pandas.pydata.org/pandas-docs/stable/dsintro.html Seria to jednowymiarowa tablica z etykietami, która może przechowywać dowolny typ danych. Aby odczytać dane w postaci serii panda:

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

DataFrame to dwuwymiarowa oznaczona struktura danych z kolumnami potencjalnie różnych typów.

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

W obu powyższych indeksach znajduje się lista

na przykład: mam plik csv z następującymi danymi:

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

Aby odczytać powyższe dane jako serię i ramkę danych:

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)

wynik:

>>> d
BR           Brazil
RU           Russia
IN            India

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

wynik:

>>> df
      area
BR   12015
RU     457
IN  457787
Umesh Kaushik
źródło
2
jeśli ktoś stara się głosować przeciw, czy mógłbyś również spróbować podać powód?
Umesh Kaushik
2
Nie głosowałem przeciw, ale Twój kod nie działa. Możesz chcieć zmienić file_datana brics, dodać linię US do csv i zmienić ['BR'....'US']na brics.index. Być może poprawne pupuplation.
RolfBly,
@RolfBly: Dziękuję za wskazanie tych błędów. Z mojej strony było to głupie. Zmieniłem je. Dziękuję Ci! A jeśli chodzi o czytanie, to tylko przykład, który wziąłem, stąd przypadkowe wartości.
Umesh Kaushik
4

Seria to jednowymiarowy obiekt, który może zawierać dane dowolnego typu, takie jak liczby całkowite, zmiennoprzecinkowe i łańcuchy, np

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

0 A
1 B
2 C

Pierwsza kolumna serii jest nazywana indeksem, tj. 0,1,2, druga kolumna to Twoje rzeczywiste dane, czyli A, B, C

DataFrames to dwuwymiarowy obiekt, który może zawierać serie, listy, słownik

df=pd.DataFrame(rd(5,4),['A','B','C','D','E'],['W','X','Y','Z'])
syed irfan
źródło
2

Seria to jednowymiarowa tablica z etykietami, która może przechowywać dane dowolnego typu (liczby całkowite, ciągi znaków, liczby zmiennoprzecinkowe, obiekty Pythona itp.). Etykiety osi są zbiorczo nazywane indeksami. Podstawową metodą tworzenia serii jest wywołanie:

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

DataFrame to dwuwymiarowa oznaczona struktura danych z kolumnami potencjalnie różnych typów. Możesz myśleć o tym jak o arkuszu kalkulacyjnym, tabeli SQL lub dyktandzie obiektów 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
źródło
0

Importuj dane samochodów

import pandas as pd

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

Oto jak wygląda plik cars.csv.

Wydrukuj kolumnę drive_right jako serię:

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

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

Wersja z pojedynczym wspornikiem zapewnia serię Pandas, a wersja z podwójnym wspornikiem zapewnia ramkę Pandas DataFrame.

Wydrukuj kolumnę drive_right jako DataFrame

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

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

Dodanie serii do innej serii powoduje utworzenie ramki DataFrame.

abhishek_7081
źródło
1
wielkie dzięki za edycję. Teraz wygląda znacznie lepiej. @Zoe
abhishek_7081