본문 바로가기
Flutter/Flutter FAQ

Python 판다스 데이터프레임에서 여러 열 선택하기, Selecting multiple columns in a Pandas dataframe

by 베타코드 2023. 5. 19.
반응형

질문


ab 열을 df에서 선택하여 새로운 데이터프레임 df1에 저장하는 방법은 무엇인가요?

index  a   b   c
1      2   3   4
2      3   4   5

실패한 시도:

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

답변


열 이름(문자열)은 시도한 방식으로 슬라이스할 수 없습니다.

여기에는 몇 가지 옵션이 있습니다. 슬라이스하려는 변수가 어떤 것인지 컨텍스트에서 알고 있다면, 리스트를 __getitem__ 구문 (대괄호)에 전달하여 해당 열만 보이도록 뷰를 반환할 수 있습니다.

df1 = df[['a', 'b']]

또는 이름이 아닌 숫자로 인덱싱해야 하는 경우 (처음 두 열의 이름을 모르는 경우 코드가 자동으로 수행되어야 함) 대신 다음을 수행할 수 있습니다.

df1 = df.iloc[:, 0:2] # Python은 끝 인덱스를 포함하여 슬라이스하지 않는다는 것을 기억하세요.

또한, 판다스 객체의 뷰와 복사본의 개념에 익숙해져야 합니다. 위의 두 가지 방법 중 첫 번째 방법은 원하는 하위 객체(원하는 슬라이스)의 새로운 복사본을 반환합니다.

그러나 때로는 이렇게 하지 않고 원래 객체의 하위 객체나 슬라이스와 동일한 메모리 청크를 참조하는 새 변수를 제공하는 판다스 인덱싱 규칙이 있습니다. 이것은 두 번째 인덱싱 방법에서 발생하므로 .copy() 메서드로 수정하여 일반 복사본을 얻을 수 있습니다. 이 경우, 슬라이스 객체라고 생각하는 것을 변경하면 원래 객체가 변경될 수 있습니다. 항상 이를 주시하는 것이 좋습니다.

df1 = df.iloc[0, 0:2].copy() # df1도 df를 변경하는 경우를 피하기 위해

iloc을 사용하려면 열 위치(또는 인덱스)를 알아야 합니다. 열 위치가 바뀔 수 있으므로 인덱스를 하드코딩하는 대신, 데이터프레임 객체의 columns 메서드의 get_loc 함수와 함께 iloc을 사용하여 열 인덱스를 얻을 수 있습니다.

{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}

이제 이 사전을 사용하여 이름을 통해 열에 액세스하고 iloc을 사용할 수 있습니다.

반응형

댓글