programing

레이블로 선택한 판다는 때때로 Series를 반환하고 DataFrame을 반환합니다.

bestprogram 2023. 7. 21. 21:48

레이블로 선택한 판다는 때때로 Series를 반환하고 DataFrame을 반환합니다.

Pandas에서 인덱스에 항목이 하나만 있는 레이블을 선택하면 Series(영상 시리즈)가 반환되지만 항목이 둘 이상인 항목을 선택하면 데이터 프레임이 반환됩니다.

왜 그런 것일까요?데이터 프레임을 항상 복구할 수 있는 방법이 있습니까?

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3])

In [3]: type(df.loc[3])
Out[3]: pandas.core.frame.DataFrame

In [4]: type(df.loc[1])
Out[4]: pandas.core.series.Series

행동이 일관성이 없다는 것은 인정하지만, 이것이 편리한 경우는 쉽게 상상할 수 있다고 생각합니다.어쨌든, 매번 데이터 프레임을 가져오려면 목록을 다음으로 전달하십시오.loc다른 방법도 있지만, 제 생각에는 이것이 가장 깨끗합니다.

In [2]: type(df.loc[[3]])
Out[2]: pandas.core.frame.DataFrame

In [3]: type(df.loc[[1]])
Out[3]: pandas.core.frame.DataFrame

TLDR

을 할 때loc

df.loc[:]데이터 프레임

df.loc[int]둘 이상의 열이 있는 경우 데이터 프레임, 데이터 프레임에 열이 하나만 있는 경우 시리즈

df.loc[:, ["col_name"]]행이 둘 이상인 경우 데이터 프레임, 선택 영역에 행이 하나만 있는 경우 영상 시리즈

df.loc[:, "col_name"]시리즈

사용하지 않음loc

df["col_name"]시리즈

df[["col_name"]]데이터 프레임

은 세 개의 색인을 .3이러한 이유로df.loc[3]데이터 프레임을 반환합니다.

그 이유는 열을 지정하지 않기 때문입니다.df.loc[3]열의 세열 모 열 즉 세 을 열 다 니 (선, 합) 택을 선택합니다.0)), 한편한df.loc[3,0]시리즈를 반환합니다.예.df.loc[1:2]행을 잘라내기 때문에 데이터 프레임도 반환합니다.

행 (" " " " " " ( " 로서)df.loc[1]) 열 이름을 인덱스로 사용하여 시리즈를 반환합니다.

, "DataFrame"과 같이 슬라이스할 수 있습니다.df.loc[1:1]또 인덱싱(booleanindexing)입니다.df.loc[df.index==1]메소드 () () 또는테 크메소드이(드()df.take([0])하지만 이 위치는 레이블이 아니라 사용되었습니다!).

사용하다df['columnName']와 리즈와시를 df[['columnName']]데이터 프레임을 가져옵니다.

당신은 조리스의 대답에 댓글로 다음과 같이 썼습니다.

"단일 행을 열로 변환하는 설계 결정을 이해할 수 없습니다. 행이 하나인 데이터 프레임은 왜 사용하지 않습니까?"

단일 행은 시리즈에서 변환되지 않습니다.
시리즈입니다.No, I don't think so, in fact; see the edit

판다 데이터 구조에 대해 생각하는 가장 좋은 방법은 저차원 데이터를 위한 유연한 용기입니다.예를 들어 DataFrame은 Series를 위한 컨테이너이고 Panel은 DataFrame 개체를 위한 컨테이너입니다.우리는 사전과 같은 방식으로 이 컨테이너들에서 물체를 삽입하고 제거할 수 있기를 원합니다.

http://pandas.pydata.org/pandas-docs/stable/overview.html#why-more-than-1-data-structure

판다 개체의 데이터 모델은 그렇게 선택되었습니다.그 이유는 확실히 제가 모르는 몇 가지 이점을 보장한다는 사실에 있습니다(인용문의 마지막 문장을 완전히 이해하지 못합니다, 아마도 그 이유일 것입니다).

.

편집: 동의하지 않습니다.

다음 코드는 열뿐만 아니라 행에 대해서도 동일한 유형의 "Series"를 제공하기 때문에 데이터 프레임을 Series로 구성할 수 없습니다.

import pandas as pd

df = pd.DataFrame(data=[11,12,13], index=[2, 3, 3])

print '-------- df -------------'
print df

print '\n------- df.loc[2] --------'
print df.loc[2]
print 'type(df.loc[1]) : ',type(df.loc[2])

print '\n--------- df[0] ----------'
print df[0]
print 'type(df[0]) : ',type(df[0])

결과

-------- df -------------
    0
2  11
3  12
3  13

------- df.loc[2] --------
0    11
Name: 2, dtype: int64
type(df.loc[1]) :  <class 'pandas.core.series.Series'>

--------- df[0] ----------
2    11
3    12
3    13
Name: 0, dtype: int64
type(df[0]) :  <class 'pandas.core.series.Series'>

따라서 데이터 프레임이 시리즈로 구성되어 있는 것처럼 가장하는 것은 의미가 없습니다. 시리즈는 열이나 행이나 바보 같은 질문과 비전을 의미하기 때문입니다.

.

그렇다면 데이터 프레임이란 무엇입니까?

이 답변의 이전 버전에서, 저는 이 질문을 던졌습니다, 답을 찾기 위해 노력했습니다.Why is that?와 유사한 OP 와유사질의문일부한일부▁part▁interrog▁of▁similar.single rows to get converted into a series - why not a data frame with one row?논평 중 에서, 의견의중하서나그에,서,
天皇가 동안에이사.Is there a way to ensure I always get back a data frame?Dan Allan이 부품에 응답했습니다.

그리고 나서, 위에 인용된 Panda의 문서에서 Panda의 데이터 구조가 저차원 데이터의 컨테이너로 가장 잘 보인다고 했듯이, 저는 이유에 대한 이해가 DataFrame 구조의 특성에서 찾을 수 있을 것이라고 생각했습니다.

하지만, 저는 이 인용된 조언이 판다의 데이터 구조의 특성에 대한 정확한 설명으로 받아들여져서는 안 된다는 것을 깨달았습니다.
이 조언은 데이터 프레임이 시리즈의 컨테이너라는 것을 의미하지 않습니다.
이는 데이터 프레임을 시리즈 컨테이너(추론의 한 순간에 고려된 옵션에 따른 행 또는 열)로 정신적으로 표현하는 것이 실제로는 엄밀하게 그렇지 않더라도 데이터 프레임을 고려하는 좋은 방법임을 나타냅니다."좋아요"는 이 비전을 통해 데이터 프레임을 효율적으로 사용할 수 있음을 의미합니다.이상입니다.

.

그렇다면 DataFrame 객체는 무엇입니까?

DataFrame 클래스는 시리즈 클래스의 상위 클래스이기도 한 PandasContainer 기본 클래스에서 파생된 NDFrame 기본 클래스에서 유래한 특정 구조를 가진 인스턴스를 생성합니다.
버전 0.12 이전의 Panda는 이 값이 맞습니다.다가오는 버전 0.13에서는 시리즈가 NDFrame 클래스에서만 파생될 것입니다.

# with pandas 0.12

from pandas import Series
print 'Series  :\n',Series
print 'Series.__bases__  :\n',Series.__bases__

from pandas import DataFrame
print '\nDataFrame  :\n',DataFrame
print 'DataFrame.__bases__  :\n',DataFrame.__bases__

print '\n-------------------'

from pandas.core.generic import NDFrame
print '\nNDFrame.__bases__  :\n',NDFrame.__bases__

from pandas.core.generic import PandasContainer
print '\nPandasContainer.__bases__  :\n',PandasContainer.__bases__

from pandas.core.base import PandasObject
print '\nPandasObject.__bases__  :\n',PandasObject.__bases__

from pandas.core.base import StringMixin
print '\nStringMixin.__bases__  :\n',StringMixin.__bases__

결과

Series  :
<class 'pandas.core.series.Series'>
Series.__bases__  :
(<class 'pandas.core.generic.PandasContainer'>, <type 'numpy.ndarray'>)

DataFrame  :
<class 'pandas.core.frame.DataFrame'>
DataFrame.__bases__  :
(<class 'pandas.core.generic.NDFrame'>,)

-------------------

NDFrame.__bases__  :
(<class 'pandas.core.generic.PandasContainer'>,)

PandasContainer.__bases__  :
(<class 'pandas.core.base.PandasObject'>,)

PandasObject.__bases__  :
(<class 'pandas.core.base.StringMixin'>,)

StringMixin.__bases__  :
(<type 'object'>,)

이제 DataFrame 인스턴스에는 행과 열에서 데이터를 추출하는 방법을 제어하기 위해 만들어진 특정 메서드가 있습니다.

이러한 추출 방법의 작동 방식은 다음 페이지에 설명되어 있습니다. http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
우리는 그 안에서 댄 앨런과 다른 방법들에 의해 주어진 방법을 찾습니다.

이러한 추출 방법이 원래대로 만들어진 이유는 무엇입니까?
이는 데이터 분석의 가능성과 용이성을 제공하는 것으로 평가되었기 때문입니다.
바로 이 문장에 표현된 것입니다.

판다 데이터 구조에 대해 생각하는 가장 좋은 방법은 저차원 데이터를 위한 유연한 용기입니다.

데이터에서 데이터를 추출하는 이유프레임 인스턴스는 구조에 있는 것이 아니라 구조의 이유에 있습니다.판다의 데이터 구조의 구조와 기능은 최대한 지적으로 직관적이 되도록 짜여져 있고, 세부 사항을 이해하려면 웨스 맥키니의 블로그를 읽어야 한다고 생각합니다.

집합을 ▁using▁if▁set다▁it좋▁data,▁using니▁of습▁avoid▁a▁index▁is▁best▁subset▁the인▁the덱▁to▁the▁is▁objective가장▁get스▁to것이않는를을 사용하지 않는 것이 가장 좋습니다.loc또는iloc을 사용해야 합니다.

df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3])
result = df[df.index == 3] 
isinstance(result, pd.DataFrame) # True

result = df[df.index == 1]
isinstance(result, pd.DataFrame) # True

가 을넣때를 넣을 [['column name']] DataFrame을 합니다.['column name']우리는 판다 시리즈 물체를 얻었습니다.

데이터 프레임의 인덱스에서도 선택하는 경우 결과는 데이터 프레임 또는 시리즈이거나 시리즈 또는 스칼라(단일 값)일 수 있습니다.

이 기능을 사용하면 항상 선택한 항목에서 목록을 얻을 수 있습니다(df, 인덱스 및 열이 유효한 경우).

def get_list_from_df_column(df, index, column):
    df_or_series = df.loc[index,[column]] 
    # df.loc[index,column] is also possible and returns a series or a scalar
    if isinstance(df_or_series, pd.Series):
        resulting_list = df_or_series.tolist() #get list from series
    else:
        resulting_list = df_or_series[column].tolist() 
        # use the column key to get a series from the dataframe
    return(resulting_list)

언급URL : https://stackoverflow.com/questions/20383647/pandas-selecting-by-label-sometimes-return-series-sometimes-returns-dataframe