อะไรคือความแตกต่างระหว่างซีรีย์แพนด้าและ DataFrame คอลัมน์เดี่ยว


168

ทำไมนุ่นถึงทำให้ความแตกต่างระหว่างSeriesและคอลัมน์เดียวDataFrame?
กล่าวอีกนัยหนึ่ง: อะไรคือเหตุผลของการดำรงอยู่ของSeriesชั้นเรียน?

ฉันใช้อนุกรมเวลากับดัชนีวันที่และเวลาเป็นหลักซึ่งอาจช่วยในการกำหนดบริบท


ฉันคิดว่าคุณกำลังอ้างถึงการดำเนินการบางอย่างที่ยังคงส่งคืน dataframe อย่างใดอย่างหนึ่งเนื่องจากคุณมีเพียง dataframe คอลัมน์เดียวหรือเนื่องจากการดำเนินการส่งผลให้เป็น dataframe คอลัมน์เดียว อย่างไรก็ตามเมื่อเลือกคอลัมน์เดียวไม่มีความกำกวมและสิ่งนี้จะสลายไปสู่ซีรีส์ คุณต้องแสดงโค้ดตัวอย่างเพื่ออธิบายว่าปัญหาของคุณคืออะไร
EdChum

อาจเกี่ยวข้อง: stackoverflow.com/questions/16782323/…
EdChum

6
ปัญหาหลักคือฉันไม่เห็นความต้องการวัตถุ Series ด้วยวิธีการต่าง ๆ
saroele

สำหรับหนึ่งมีความแตกต่าง namespace ซีรีส์มีเพียงชื่อระดับบนสุดดาต้าเฟรมมีระดับบนสุดและชื่อคอลัมน์ ที่สามารถนำไปสู่ความแตกต่างอย่างมีนัยสำคัญในไวยากรณ์สำหรับการประมวลผล / สร้างซีรีส์ใหม่เทียบกับคอลัมน์ใหม่
JohnE

4
เท่าที่ฉันจะบอกได้คำถามนี้ก็ยังควรตอบ แม้ว่าใครจะคิดว่าDataFrameเป็นdictของSeries(ว่าที่ไม่ได้ใช้งานปัจจุบัน) ก็ยังไม่ชัดเจนว่าทำไมคุณเคยจะกลับมาเป็นSeriesวัตถุแทนDataFrame(เช่นแนวคิดdictกับหนึ่งรายการ)
อเล็กซ์

คำตอบ:


190

การอ้างอิงเอกสารของนุ่น

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

โครงสร้างข้อมูลแบบตารางที่ผันแปรไม่ได้สองมิติที่มีความหลากหลายและมีแกนกำกับ (แถวและคอลัมน์) การดำเนินการทางคณิตศาสตร์จัดอยู่ในฉลากทั้งแถวและคอลัมน์ สามารถนึกได้ว่าเป็นภาชนะบรรจุคล้าย dict สำหรับวัตถุซีรี่ส์ โครงสร้างข้อมูลหลักของนุ่น

ดังนั้นSeries เป็นโครงสร้างข้อมูลสำหรับคอลัมน์เดียวของDataFrameไม่เพียง แต่แนวคิด แต่แท้จริงคือข้อมูลในส่วนที่ถูกเก็บไว้ในหน่วยความจำจริงเป็นคอลเลกชันของDataFrameSeries

อะนาล็อก: เราต้องการทั้งรายการและเมทริกซ์เพราะเมทริกซ์ถูกสร้างด้วยรายการ การเข้าแถวเดี่ยวในขณะที่รายการเทียบเท่าในการทำงานยังคงไม่สามารถอยู่ได้หากไม่มีรายการที่ประกอบด้วย

ทั้งคู่มี API ที่คล้ายกันมาก แต่คุณจะพบว่าDataFrameวิธีการต่าง ๆ นั้นมีความเป็นไปได้ที่คุณจะมีมากกว่าหนึ่งคอลัมน์ และแน่นอนคุณสามารถเพิ่มอีกSeries(หรือวัตถุเทียบเท่า) ไปDataFrameขณะที่การเพิ่มSeriesไปยังอีกที่เกี่ยวข้องกับการสร้างSeriesDataFrame


2
ขอบคุณสำหรับคำตอบ. คำถามของฉันได้รับแรงบันดาลใจจากจุดบกพร่องในรหัสของฉันเมื่อมีการเลือกใน dataframe ส่งคืนชุดข้อมูลแทนและฉันไม่สามารถเข้าถึงแอตทริบิวต์คอลัมน์ได้ ฉันไม่ใช่คนเดียวที่สับสน: stackoverflow.com/questions/16782323/…
saroele

ฉันเห็น. บางทีมันอาจช่วยได้หากพวกเขามี__repr__พฤติกรรมที่แตกต่างกันดังนั้นคุณจึงไม่สามารถผสมมันได้?
PythonNut

6
คุณไม่สามารถสรุปอะไรเกี่ยวกับโครงสร้างข้อมูลที่เกิดขึ้นจริงภายในของจากDataFrame Can be thought of as a dict-like container for Series objectsที่จริงแล้วมันถูกเก็บไว้เป็นBlockManager(ซึ่งเป็นรายละเอียดการใช้งานที่คุณไม่ควรเชื่อถือ)
timdiels

1
ฉันยังสับสนอยู่ดังนั้นเมื่อใดที่ฉันจะใช้ DataFrame คอลัมน์เดี่ยวแทนที่จะเป็นซีรี่ส์
dhiraj suvarna

4
ฉันอาจจะคล่องแคล่ว แต่ฉันไม่เห็นคำถามของ OP เกี่ยวกับว่าทำไมซีรี่ส์มีคำตอบ ฉันเห็นคำตอบที่อธิบายถึงความสัมพันธ์ระหว่างชุดข้อมูลและชุดข้อมูล แต่ไม่ใช่คำตอบที่อธิบายว่าทำไมเราจึงต้องการให้ชุดข้อมูลแยกประเภทเมื่อเทียบกับกรณีที่เป็นกรณีพิเศษของ dataframe (คือมีเพียงหนึ่งคอลัมน์เท่านั้น)
MightyCurious

14

จาก pandas doc http://pandas.pydata.org/pandas-docs/stable/dsintro.html ซีรีย์เป็นอาร์เรย์ที่มีป้ายกำกับหนึ่งมิติที่สามารถเก็บชนิดข้อมูลใด ๆ ได้ หากต้องการอ่านข้อมูลในรูปแบบของซีรี่ส์แพนด้า:

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

DataFrame เป็นโครงสร้างข้อมูลแบบ 2 มิติพร้อมคอลัมน์ที่มีชนิดแตกต่างกัน

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

ในดัชนีทั้งสองข้างต้นเป็นรายการ

ตัวอย่างเช่น: ฉันมีไฟล์ csv ที่มีข้อมูลต่อไปนี้:

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

หากต้องการอ่านข้อมูลข้างต้นเป็นชุดข้อมูลและกรอบข้อมูล:

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)

เอาท์พุท:

>>> d
BR           Brazil
RU           Russia
IN            India

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

เอาท์พุท:

>>> df
      area
BR   12015
RU     457
IN  457787

2
หากมีใครพยายามลงคะแนนคุณพยายามพูดถึงเหตุผลด้วยหรือไม่?
Umesh Kaushik

2
ฉันไม่ได้ลงคะแนน แต่รหัสของคุณใช้งานไม่ได้ คุณอาจต้องการที่จะเปลี่ยนfile_dataเพื่อbricsเพิ่มบรรทัดสหรัฐ CSV และการเปลี่ยนแปลงไป['BR'....'US'] ที่ถูกต้องบางทีbrics.index pupuplation
RolfBly

@RolfBly: ขอบคุณที่ชี้ให้เห็นข้อผิดพลาดเหล่านั้น ในส่วนของฉันมันช่างโง่เขลา ฉันได้เปลี่ยนพวกเขา ขอบคุณ! และเกี่ยวกับการอ่านนั่นเป็นเพียงตัวอย่างที่ฉันเอามาดังนั้นค่าสุ่ม
Umesh Kaushik

4

Series เป็นวัตถุหนึ่งมิติที่สามารถเก็บข้อมูลชนิดใดก็ได้เช่นจำนวนเต็มลอยและสตริงเช่น

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

0 A
1 B
2 C

คอลัมน์แรกของซีรี่ส์เรียกว่าดัชนีเช่น 0,1,2 คอลัมน์ที่สองคือข้อมูลจริงของคุณเช่น A, B, C

DataFrames เป็นวัตถุสองมิติที่สามารถเก็บอนุกรมรายการพจนานุกรม

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

2

ซีรีย์เป็นอาเรย์หนึ่งมิติที่มีความสามารถในการเก็บข้อมูลชนิดใด ๆ (จำนวนเต็ม, สตริง, ตัวเลขจุดลอยตัว, วัตถุ Python ฯลฯ ) ป้ายชื่อแกนเรียกรวมว่าดัชนี วิธีการพื้นฐานในการสร้างซีรี่ส์คือการโทร:

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

DataFrame เป็นโครงสร้างข้อมูลแบบ 2 มิติพร้อมคอลัมน์ที่มีชนิดแตกต่างกัน คุณสามารถนึกถึงมันเช่นสเปรดชีตหรือตาราง SQL หรือชุดวัตถุวัตถุ

 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

นำเข้าข้อมูลรถยนต์

import pandas as pd

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

นี่คือลักษณะของไฟล์ cars.csv

พิมพ์ไดรฟ์คอลัมน์ _right เป็นซีรี่ส์:

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

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

รุ่น Bracket เดี่ยวให้ Pandas Series รุ่น Bracket คู่ให้ Pandas DataFrame

พิมพ์คอลัมน์ drivers_right เป็น DataFrame

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

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

การเพิ่มซีรีส์ในซีรีย์อื่นจะสร้าง DataFrame


1
ขอบคุณมากสำหรับการแก้ไข มันดูดีขึ้นมากในขณะนี้. @Zoe
abhishek_7081
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.