팬더 시리즈와 단일 열 DataFrame의 차이점은 무엇입니까?


168

팬더가 왜 Series단일 열과 단일 열을 구별 DataFrame합니까?
다시 말해, Series수업 이 존재하는 이유는 무엇 입니까?

나는 주로 날짜 시간 인덱스와 함께 시계열을 사용하고 있습니다. 어쩌면 컨텍스트를 설정하는 데 도움이 될 수 있습니다.


글쎄, 분명히 다릅니다. 단일 열 데이터 프레임 만 있거나 작업 결과 단일 열 데이터 프레임이 있기 때문에 여전히 데이터 프레임을 반환하는 특정 작업을 참조한다고 생각합니다. 그러나 단일 열을 선택할 때 모호성이 없으며 이것은 시리즈로 분해됩니다. 문제가 무엇인지 설명하기 위해 샘플 코드를 보여 주어야합니다.
EdChum


6
주요 문제는 다른 방법으로 Series 객체가 필요하지 않다는 것입니다.
saroele

우선 네임 스페이스 차이가 있습니다. 시리즈에는 최상위 이름 만 있고 데이터 프레임에는 최상위 수준과 열 이름이 있습니다. 이로 인해 새 시리즈와 새 열을 처리 / 만들기위한 구문이 크게 달라질 수 있습니다.
JohnE

4
내가 알 수있는 한이 질문에 여전히 대답해야합니다. 하나 생각할 수 있지만 DataFrameA와 dictSeries(즉, 현재 구현은 아니지만) 혹시 반환하는 이유, 그것은 여전히 불분명 Series대신 객체를 DataFrame(즉, 개념적으로 dict하나 개의 항목으로).
Alex

답변:


190

팬더 문서 인용

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

레이블이 지정된 축 (행 및 열)을 가진 2 차원 크기 변경 가능, 이종 가능성이있는 테이블 형식 데이터 구조. 산술 연산은 행 및 열 레이블 모두에 정렬됩니다. Series 객체의 dict-like 컨테이너로 생각할 수 있습니다. 기본 팬더 데이터 구조.

따라서 Series는DataFrame 개념적으로뿐만 아니라 문자 그대로 의 단일 열에 대한 데이터 구조입니다. 즉,의 데이터 DataFrame는 실제로의 컬렉션으로 메모리에 저장됩니다 Series.

유사하게 : 행렬은 목록으로 만들어지기 때문에 목록과 행렬이 모두 필요합니다. 단일 행 수학은 기능의 목록과 동일하지만 구성된 목록 없이는 존재할 수 없습니다.

둘 다 API가 매우 비슷하지만 DataFrame메소드가 항상 두 개 이상의 열을 가질 가능성을 충족시키는 것을 알 수 있습니다. 그리고, 물론, 당신은 항상 다른 추가 할 수 있습니다 SeriesA와 (또는 동등한 개체) DataFrame추가하는 동안, Series다른이 Series를 만드는 작업이 포함됩니다 DataFrame.


2
답변 주셔서 감사합니다. 내 질문은 데이터 프레임에서 선택 항목이 갑자기 시리즈를 반환하고 columns 속성에 액세스 할 수 없을 때 코드의 버그에서 영감을 얻었습니다. : 나는 단 하나의 혼란 아니에요 stackoverflow.com/questions/16782323/...
saroele

내가 참조. 그들이 다른 __repr__행동을 한다면 도움이 될 것입니다 . 그래서 그것들을 섞을 수 없습니까?
PythonNut

6
DataFramefrom 의 실제 내부 데이터 구조에 대해서는 결론을 내릴 수 없습니다 Can be thought of as a dict-like container for Series objects. 사실, 그것은 현재 BlockManager(당신이 의존해서는 안되는 구현 세부 사항)으로 저장됩니다.
timdiels

1
여전히 혼란 스럽습니다. 시리즈 대신 단일 열 데이터 프레임을 언제 사용합니까?
dhiraj suvarna

4
나는 pedantic 할지도 모르지만 OP의 WHY 시리즈 질문에 대한 답변이 보이지 않습니다. 시리즈와 데이터 프레임 사이의 관계를 설명하는 대답을 볼 수 있지만 데이터 프레임의 특수한 경우 (즉, 하나의 열만있는 경우)와 달리 별도의 데이터 유형으로 시리즈를 가져야하는 이유는 설명하지 않습니다.
MightyCurious

14

팬더 문서에서 http://pandas.pydata.org/pandas-docs/stable/dsintro.html Series는 모든 데이터 유형을 보유 할 수있는 1 차원 레이블이 지정된 배열입니다. 팬더 시리즈의 형태로 데이터를 읽으려면 :

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_databrics, 미국 csv로에 라인과 변화를 추가 ['BR'....'US']brics.index. 아마 맞습니다 pupuplation.
RolfBly

@RolfBly : 이러한 실수를 지적 해 주셔서 감사합니다. 그들을 만드는 것은 내 멍청한 짓이었다. 나는 그들을 바꿨다. 감사합니다! 그리고 그 예제를 읽는 것과 관련하여 나는 임의의 값을 취했습니다.
Umesh Kaushik

4

Series는 정수, 부동 및 문자열과 같은 모든 데이터 유형을 보유 할 수있는 1 차원 객체입니다.

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

0 A
1 B
2 C

Series의 첫 번째 열은 인덱스 즉 0,1,2로 알려져 있습니다. 두 번째 열은 실제 데이터입니다. 즉 A, B, C

DataFrames는 시리즈, 목록, 사전을 담을 수있는 2 차원 객체입니다.

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

2

Series는 모든 데이터 유형 (정수, 문자열, 부동 소수점 숫자, Python 객체 등)을 보유 할 수있는 1 차원 레이블이 지정된 배열입니다. 축 레이블을 총칭하여 인덱스라고합니다. 시리즈를 작성하는 기본 방법은 다음을 호출하는 것입니다.

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

DataFrame은 잠재적으로 다른 유형의 열이있는 2 차원 레이블이 지정된 데이터 구조입니다. 스프레드 시트 나 SQL 테이블 또는 Series 객체의 dict처럼 생각할 수 있습니다.

 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 파일의 모습입니다.

drives_right 컬럼을 Series로 인쇄하십시오.

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

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

단일 브래킷 버전은 Pandas Series를 제공하고 이중 브래킷 버전은 Pandas DataFrame을 제공합니다.

drives_right 열을 DataFrame으로 인쇄

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

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

다른 Series에 Series를 추가하면 DataFrame이 생성됩니다.


1
편집 해 주셔서 감사합니다. 지금 훨씬 나아 보입니다. @Zoe
abhishek_7081
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.