Apa perbedaan antara Seri panda dan DataFrame satu kolom?

168

Mengapa panda membuat perbedaan antara a Seriesdan satu kolom DataFrame?
Dengan kata lain: apa alasan keberadaan Serieskelas?

Saya terutama menggunakan deret waktu dengan indeks datetime, mungkin itu membantu untuk mengatur konteks.

saroele
sumber
Yah mereka berbeda jelas, saya pikir Anda mengacu pada operasi tertentu yang masih mengembalikan dataframe baik karena Anda hanya memiliki dataframe kolom tunggal atau karena operasi menghasilkan dataframe kolom tunggal. Namun ketika memilih satu kolom tidak ada ambiguitas dan ini terurai menjadi sebuah Seri. Anda harus menunjukkan kode sampel untuk menjelaskan masalah Anda.
EdChum
6
Masalah utama adalah bahwa saya tidak melihat perlunya objek Series, dengan metode yang berbeda.
saroele
Untuk satu, ada perbedaan namespace. Seri hanya memiliki nama tingkat atas, kerangka data memiliki tingkat atas dan nama kolom. Itu dapat menyebabkan perbedaan signifikan dalam sintaksis untuk memproses / membuat seri baru vs kolom baru.
JohnE
4
Sejauh yang saya tahu, pertanyaan ini masih harus dijawab. Meskipun salah satu bisa memikirkan DataFramesebagai dictdari Series(meskipun itu tidak implementasi saat), itu masih belum jelas mengapa Anda akan pernah kembali sebuah Seriesobjek bukan sebuah DataFrame(yaitu konseptual dictdengan satu entry).
Alex

Jawaban:

190

Mengutip dokumen Pandas

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

Struktur data tabel dua dimensi yang dapat berubah dan berpotensi heterogen dengan sumbu berlabel (baris dan kolom). Operasi aritmatika selaras pada label baris dan kolom. Dapat dianggap sebagai wadah seperti dict untuk objek Seri. Struktur data panda primer.

Jadi, Seri adalah struktur data untuk satu kolom tunggalDataFrame , tidak hanya secara konseptual, tetapi secara harfiah, yaitu data dalam a DataFramesebenarnya disimpan dalam memori sebagai kumpulan Series.

Secara analog: Kami membutuhkan daftar dan matriks, karena matriks dibuat dengan daftar. Matriks baris tunggal, sementara yang setara dengan daftar dalam fungsionalitas masih tidak dapat ada tanpa daftar yang terdiri darinya.

Keduanya memiliki API yang sangat mirip, tetapi Anda akan menemukan bahwa DataFramemetode selalu memenuhi kemungkinan Anda memiliki lebih dari satu kolom. Dan, tentu saja, Anda selalu dapat menambahkan yang lain Series(atau objek yang setara) ke DataFrame, sambil menambahkan Serieske yang lain Seriesmelibatkan pembuatan a DataFrame.

PythonNut
sumber
2
Terima kasih atas jawaban anda. Pertanyaan saya terinspirasi oleh bug dalam kode saya ketika pilihan pada kerangka data tiba-tiba mengembalikan seri dan saya tidak bisa mengakses atribut kolom. Saya bukan satu-satunya yang bingung: stackoverflow.com/questions/16782323/…
saroele
Saya melihat. Mungkin itu akan membantu jika mereka memiliki __repr__perilaku yang berbeda , sehingga Anda tidak dapat mencampuradukkannya?
PythonNut
6
Anda tidak dapat menyimpulkan apa pun tentang struktur data internal aktual dari DataFramedari Can be thought of as a dict-like container for Series objects. Bahkan, saat ini disimpan sebagai BlockManager(yang merupakan detail implementasi Anda tidak harus bergantung pada).
timdiels
1
Saya masih bingung, jadi kapan saya akan menggunakan kerangka data Kolom Tunggal alih-alih Seri?
dhiraj suvarna
4
Saya mungkin bertele-tele, tapi saya tidak melihat pertanyaan OP tentang seri MENGAPA ada dijawab. Saya melihat jawaban yang menggambarkan hubungan antara seri dan kerangka data, tetapi bukan jawaban yang menjelaskan mengapa kita ingin memiliki rangkaian sebagai tipe data terpisah sebagai lawan menjadi kasus khusus dari kerangka data (yaitu satu dengan hanya satu kolom).
MightyCurious
14

dari panda doc http://pandas.pydata.org/pandas-docs/stable/dsintro.html Series adalah array berlabel satu dimensi yang mampu menampung semua tipe data. Untuk membaca data dalam bentuk Seri panda:

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

DataFrame adalah struktur data berlabel 2 dimensi dengan kolom dari tipe yang berpotensi berbeda.

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

Dalam kedua indeks di atas adalah daftar

misalnya: Saya punya file csv dengan data berikut:

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

Untuk membaca data di atas sebagai seri dan bingkai data:

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)

keluaran:

>>> d
BR           Brazil
RU           Russia
IN            India

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

keluaran:

>>> df
      area
BR   12015
RU     457
IN  457787
Umesh Kaushik
sumber
2
jika ada yang berupaya untuk menurunkan suara, dapatkah Anda juga mencoba menyebutkan alasannya?
Umesh Kaushik
2
Saya tidak mengunduh, tetapi kode Anda tidak berfungsi. Anda mungkin ingin mengubah file_datake brics, menambahkan baris AS untuk csv, dan perubahan ['BR'....'US']ke brics.index. Mungkin benar pupuplation.
RolfBly
@RolfBly: Terima kasih telah menunjukkan kesalahan itu. Bodoh bagiku untuk membuatnya. Saya telah mengubahnya. Terima kasih! Dan mengenai membaca itu hanya contoh saya mengambil nilai acak karenanya.
Umesh Kaushik
4

Seri adalah objek satu dimensi yang dapat menampung semua tipe data seperti integer, float dan string misalnya

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

0 A
1 B
2 C

Kolom pertama dari Seri dikenal sebagai indeks yaitu 0,1,2 kolom kedua adalah data aktual Anda yaitu A, B, C

DataFrames adalah objek dua dimensi yang dapat menampung seri, daftar, kamus

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

Seri adalah array berlabel satu dimensi yang mampu menampung semua tipe data (bilangan bulat, string, angka floating point, objek Python, dll.). Label sumbu secara kolektif disebut sebagai indeks. Metode dasar untuk membuat Seri adalah menelepon:

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

DataFrame adalah struktur data berlabel 2 dimensi dengan kolom dari tipe yang berpotensi berbeda. Anda bisa menganggapnya seperti spreadsheet atau tabel SQL, atau dict dari objek 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
sumber
0

Impor data mobil

import pandas as pd

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

Berikut ini tampilan file cars.csv.

Cetak kolom drive_right sebagai 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

Versi braket tunggal memberikan Seri Pandas, versi braket ganda memberikan DataFrame Pandas.

Cetak kolom drives_right sebagai DataFrame

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

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

Menambahkan Seri ke Seri lain menciptakan DataFrame.

abhishek_7081
sumber
1
terima kasih banyak sudah mengedit. Terlihat jauh lebih baik sekarang. @Zoe
abhishek_7081