Python pandas : 선택한 열을 Series 대신 DataFrame으로 유지


92

pandas DataFrame (예 df.iloc[:, 0]: df['A'], 또는 df.A등) 에서 단일 열을 선택 하면 결과 벡터가 단일 열 DataFrame 대신 Series로 자동 변환됩니다. 그러나 DataFrame을 입력 인수로 사용하는 일부 함수를 작성하고 있습니다. 따라서 함수가 df.columns에 액세스 할 수 있다고 가정 할 수 있도록 Series 대신 단일 열 DataFrame을 처리하는 것을 선호합니다. 지금 당장은 .NET과 같은 것을 사용하여 Series를 DataFrame으로 명시 적으로 변환해야합니다 pd.DataFrame(df.iloc[:, 0]). 이것은 가장 깨끗한 방법처럼 보이지 않습니다. 결과가 Series 대신 단일 열 DataFrame이되도록 DataFrame에서 직접 인덱싱하는 더 우아한 방법이 있습니까?


6
df.iloc [:, [0]] 또는 df [[ 'A']]; 그러나 df.A는 시리즈를 돌려 줄 것입니다
Jeff

답변:


99

@Jeff가 언급했듯이이를 수행하는 몇 가지 방법이 있지만, loc / iloc을 사용하여보다 명시 적으로 사용하는 것이 좋습니다 (모호한 작업을 시도하는 경우 조기에 오류 발생).

In [10]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])

In [11]: df
Out[11]:
   A  B
0  1  2
1  3  4

In [12]: df[['A']]

In [13]: df[[0]]

In [14]: df.loc[:, ['A']]

In [15]: df.iloc[:, [0]]

Out[12-15]:  # they all return the same thing:
   A
0  1
1  3

후자의 두 가지 선택은 정수 열 이름 (정확히 loc / iloc이 생성 된 이유)의 경우 모호성을 제거합니다. 예를 들면 :

In [16]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 0])

In [17]: df
Out[17]:
   A  0
0  1  2
1  3  4

In [18]: df[[0]]  # ambiguous
Out[18]:
   A
0  1
1  3

2
귀찮게해서 미안하지만 이것에 대한 정말 간단한 질문입니다. 추가 []로 결과가 a DataFrame대신 a 가되는 방법 Series을 알지만 pandas 문서에서 이런 종류의 인덱싱 구문이 논의되는 곳은 어디입니까? 저는이 색인 기술에 대해 "공식적인"이름을 얻으려고 노력하고 있습니다. 고마워!
sparc_spread

3
@sparc_spread pandas.pydata.org/pandas-docs/stable/indexing.html#basics "열 목록을 []에 전달하여 순서대로 열을 선택할 수 있습니다." 이름이 있는지 확실하지 않습니다!
Andy Hayden

예,없는 것 같지만 지금부터 계속 사용하겠습니다. API와 문서에 얼마나 많은 정보가 묻혀 있는지 놀랍습니다. 고마워!
sparc_spread

이 구분은 저에게 유용했습니다. 왜냐하면 때로는 단일 열 DataFrame을 원하기 때문에 Series에서 사용할 수없는 데이터에 DataFrame 메서드를 사용할 수 있기 때문입니다. (ISTR 플롯 방법은 다르게 작동했습니다). 단일 요소 목록을 사용할 수 있다는 것을 깨달았을 때 그것은 저에게 깨달음이었습니다!
RufusVS

4

으로 앤디 헤이든은 권장 인덱스 출력 (싱글 - 원주) dataframe가 갈 수있는 방법에 .iloc / .loc를 활용; 주목할 또 다른 점은 인덱스 위치를 표현하는 방법입니다. Dataframe으로 인덱싱 할 인수 값을 지정하는 동안 나열된 인덱스 레이블 / 위치 를 사용합니다 . 그렇게하지 않으면 'pandas.core.series.Series'가 반환됩니다.

입력:

    A_1 = train_data.loc[:,'Fraudster']
    print('A_1 is of type', type(A_1))
    A_2 = train_data.loc[:, ['Fraudster']]
    print('A_2 is of type', type(A_2))
    A_3 = train_data.iloc[:,12]
    print('A_3 is of type', type(A_3))
    A_4 = train_data.iloc[:,[12]]
    print('A_4 is of type', type(A_4))

산출:

    A_1 is of type <class 'pandas.core.series.Series'>
    A_2 is of type <class 'pandas.core.frame.DataFrame'>
    A_3 is of type <class 'pandas.core.series.Series'>
    A_4 is of type <class 'pandas.core.frame.DataFrame'>

1

를 사용할 수 있습니다 df.iloc[:, 0:1].이 경우 결과 벡터는 DataFrame시리즈가 아닌 a가됩니다 .

보시다시피 :

여기에 이미지 설명 입력


1

다음 세 가지 접근 방식이 언급되었습니다.

pd.DataFrame(df.loc[:, 'A'])  # Approach of the original post
df.loc[:,[['A']]              # Approach 2 (note: use iloc for positional indexing)
df[['A']]                     # Approach 3

pd.Series.to_frame ()은 또 다른 접근 방식입니다.

방법이기 때문에 위의 두 번째 및 세 번째 방법이 적용되지 않는 상황에서 사용할 수 있습니다. 특히 데이터 프레임의 열에 일부 메서드를 적용하고 출력을 계열 대신 데이터 프레임으로 변환하려는 경우 유용합니다. 예를 들어 Jupyter Notebook에서 시리즈는 예쁜 출력을 가지지 않지만 데이터 프레임은 출력됩니다.

# Basic use case: 
df['A'].to_frame()

# Use case 2 (this will give you pretty output in a Jupyter Notebook): 
df['A'].describe().to_frame()

# Use case 3: 
df['A'].str.strip().to_frame()

# Use case 4: 
def some_function(num): 
    ...

df['A'].apply(some_function).to_frame()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.