기본 Pandas: DataFrame 열 이름 바꾸기

4021 단어 pythonpandassoftware
pandas DataFrames로 작업할 때 매우 일반적인 요구 사항은 열의 이름을 바꾸는 것입니다. 열이 CSV 파일과 같은 데이터 소스에서 제공되었으며 정리가 필요할 수 있습니다. 또는 대화식 세션 중에 마음이 바뀌었을 수도 있습니다. 한 가지 이상의 방법이 있기 때문에 어떻게 할 수 있는지 살펴보겠습니다.

여러 열이 있는 pandas DataFrame이 있다고 가정해 보겠습니다.

[ins] In [1]: import pandas as pd 
         ...: import numpy as np
         ...:
         ...: df = pd.DataFrame(np.random.rand(5,5), columns=['A', 'B', 'C', 'D', 'E'])
         ...: df
Out[1]: A B C D E
0 0.811204 0.022184 0.179873 0.705248 0.098429
1 0.905231 0.447630 0.970045 0.744982 0.566889
2 0.805913 0.569044 0.760091 0.833827 0.148091
3 0.285781 0.262952 0.250169 0.496548 0.604798
4 0.420414 0.463825 0.025779 0.287122 0.880970

열의 이름을 바꾸려면 어떻게 해야 합니까? 이 작업을 수행하는 방법은 여러 가지가 있으며 실제로 이름 바꾸기가 아닌 간접적인 답변으로 시작하겠습니다. 때때로 열 이름을 바꾸고자 하는 바람은 데이터 변경과 관련이 있으므로 대신 열을 추가하게 될 수도 있습니다. 작업 중인 항목, 여유 메모리 양, 처리할 열 수에 따라 임시 탐색을 처리할 때 다른 열을 추가하는 것이 좋습니다. 중간 데이터가 있으므로 항상 뒤로 물러서서 단계를 반복하십시오. 이전 열을 삭제하여 이름 바꾸기를 완료할 수 있습니다. 이는 그다지 효율적이지는 않지만 임시 데이터 탐색의 경우 매우 일반적입니다.

df['e'] = np.maximum(df['E'], .5)

그러나 실제로 제자리에서 열의 이름을 바꾸고 싶다고 가정해 보겠습니다. 다음은 쉬운 방법이지만 한 번에 모든 열을 업데이트해야 합니다.

[ins] In [4]: print(type(df.columns))
         ...:
         ...: df.columns = ['A', 'B', 'C', 'D', 'EEEE', 'e']
<class 'pandas.core.indexes.base.Index'>

이제 열은 문자열 목록이 아니라 인덱스이므로 내부에서 DataFrame은 여기에서 올바른 작업을 수행할 수 있도록 몇 가지 작업을 수행합니다.

[ins] In [5]: try:
 ...:    df.columns = ['a', 'b']
 ...: except ValueError as ve:
 ...:    print(ve)
 ...:
Length mismatch: Expected axis has 6 elements, new values have 2 elements

이제 하나의 열만 이름을 바꾸도록 전체 열 목록을 설정해야 하는 것은 편리하지 않으므로 다른 방법이 있습니다. 먼저 rename 메서드를 사용할 수 있습니다. 이 메서드는 이전 열 이름을 새 열 이름으로 매핑하므로 원하는 만큼 이름을 바꿀 수 있습니다. 축 0 또는 "인덱스"는 DataFrame(일명 행)의 기본 인덱스이고 축 1 또는 "열"은 열에 대한 것임을 기억하십시오. 여기서 기본값은 인덱스이므로 이 인수를 전달해야 합니다.

df.rename({'A': 'aaa', 'B': 'bbb', 'EEE': 'EE'}, axis="columns")

기본적으로 일치하지 않는 매핑에 대해 불평하지 않습니다('EEE'는 열이 아니지만 이 예에서는 'EEEE'가 있음). errors='raise' 를 전달하여 강제로 오류를 발생시킬 수 있습니다. 또한 이 메서드는 수정된 DataFrame을 반환하므로 많은 DataFrame 메서드와 마찬가지로 변경 사항을 DataFrame에 유지하려면 inplace=True를 전달해야 합니다. 또는 결과를 동일한 변수에 다시 할당할 수 있습니다.

df.rename({'A': 'aaa', 'B': 'bbb', 'EEE': 'EE'}, axis=1, inplace=True)

축을 1 또는 set_index 로 설정하고 columns 메서드를 사용하여 열을 변경할 수도 있습니다. 다시 말하지만 inplace=True 변수를 재할당하지 않으려면 DataFrame을 제자리에서 업데이트합니다(이전 버전의 pandas에서는 기본값이지만 버전 1.0 이상에서는 기본값은 False).

df.set_axis(['A', 'B', 'C', 'D', 'E', 'e'], axis="columns")
rename 메서드도 함수를 사용합니다. 함수(또는 사전)를 인덱스 또는 열 매개변수로 전달하면 해당 축에 적용됩니다. 이렇게 하면 다음과 같이 후행 공백을 제거하는 것과 같이 일반 열 이름 정리를 쉽게 수행할 수 있습니다.

df.columns = ['A ', 'B ', 'C ', 'D ', 'E ', 'e']
df.rename(columns=lambda x: x.strip(), inplace=True)

또한 inplace=True를 사용하지 않는 주요 이유 중 하나는 DataFrame 생성 및 초기 설정에서 메서드 체이닝 때문입니다. 종종, 당신은 이런 일을 하게 될 것입니다.

df = pd.DataFrame(np.random.rand(2,5,), columns=np.random.rand(5)).rename(columns=lambda x: str(x)[0:5])

당신이 동의하는 것이 이것보다 훨씬 낫습니다.

df = pd.DataFrame(np.random.rand(2,5,), columns=np.random.rand(5))
df.columns = [str(x)[0:5] for x in df.columns]

좋은 웹페이지 즐겨찾기