질문
a
와 b
열을 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
을 사용할 수 있습니다.
댓글