선택한 열을 영상 시리즈가 아닌 데이터 프레임으로 유지
Panda DataFrame에서 단일 열을 선택하는 경우(예:df.iloc[:, 0]
,df['A']
또는df.A
등), 결과 벡터는 단일 열 DataFrame 대신 Series로 자동 변환됩니다.하지만 저는 DataFrame을 입력 인수로 사용하는 몇 가지 함수를 작성하고 있습니다.따라서 함수가 df.columns에 액세스할 수 있다고 가정할 수 있도록 Series 대신 단일 열 DataFrame을 처리하는 것을 선호합니다.지금은 다음과 같은 것을 사용하여 시리즈를 데이터 프레임으로 명시적으로 변환해야 합니다.pd.DataFrame(df.iloc[:, 0])
이것은 가장 깨끗한 방법처럼 보이지 않습니다.데이터 프레임에서 직접 인덱싱하여 결과가 시리즈가 아닌 단일 열 데이터 프레임이 되도록 하는 더 우아한 방법이 있습니까?
@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
Andy Hayden이 권장하는 바와 같이 .iloc/.loc을 사용하여 단일 열 데이터 프레임을 인덱싱하는 것이 방법입니다. 또 다른 주목할 점은 인덱스 위치를 표현하는 방법입니다.Dataframe으로 인덱싱할 인수 값을 지정하는 동안 나열된 인덱스 레이블/위치를 사용합니다. 그렇지 않으면 'pandas.core.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'>
이 세 가지 접근 방식이 언급되었습니다.
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()은 또 다른 접근 방식입니다.
방법이기 때문에 위의 두 번째와 세 번째 접근법이 적용되지 않는 상황에서 사용할 수 있습니다.특히 데이터 프레임의 열에 어떤 방법을 적용할 때 유용하며 출력을 열 대신 데이터 프레임으로 변환하려고 합니다.예를 들어, 주피터 노트북에서 시리즈는 예쁜 출력을 가지지 않지만 데이터 프레임은 그럴 것입니다.
# 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()
사용할 수 있습니다.df.iloc[:, 0:1]
이 경우 결과 벡터는 다음과 같습니다.DataFrame
시리즈가 아닌.
보시다시피:
(판다 이야기 1.3.4)
관련된 답변에 맥락을 조금 더 추가하고 싶습니다..to_frame()
데이터 프레임의 단일 행을 선택하고 실행하는 경우.to_frame()
그러면 인덱스가 원래 열 이름으로 구성되고 숫자 열 이름을 얻을 수 있습니다.당신은 그냥 위에 고정할 수 있습니다..T
원래 데이터 프레임의 형식으로 다시 변환하기 위해 끝까지 이동합니다(아래 참조).
import pandas as pd
print(pd.__version__) #1.3.4
df = pd.DataFrame({
"col1": ["a", "b", "c"],
"col2": [1, 2, 3]
})
# series
df.loc[0, ["col1", "col2"]]
# dataframe (column names are along the index; not what I wanted)
df.loc[0, ["col1", "col2"]].to_frame()
# 0
# col1 a
# col2 1
# looks like an actual single-row dataframe.
# To me, this is the true answer to the question
# because the output matches the format of the
# original dataframe.
df.loc[0, ["col1", "col2"]].to_frame().T
# col1 col2
# 0 a 1
# this works really well with .to_dict(orient="records") which is
# what I'm ultimately after by selecting a single row
df.loc[0, ["col1", "col2"]].to_frame().T.to_dict(orient="records")
# [{'col1': 'a', 'col2': 1}]
언급URL : https://stackoverflow.com/questions/16782323/keep-selected-column-as-dataframe-instead-of-series
'prosource' 카테고리의 다른 글
연속화, 도면요소를 일반 객체로 변환 (0) | 2023.08.01 |
---|---|
SQL*Plus에서 화면 지우기 (0) | 2023.08.01 |
봄 - 동일한 애플리케이션에서 여러 트랜잭션 관리자를 사용할 수 있습니까? (0) | 2023.08.01 |
GCC로 C 프로그램의 진입점을 변경하는 방법은 무엇입니까? (0) | 2023.08.01 |
"position: sticky;" 속성은 어떻게 작동합니까? (0) | 2023.08.01 |