팬더에서 특정 열 이름 바꾸기


182

라는 데이터 프레임이 data있습니다. 열 헤더를 하나만 바꾸려면 어떻게해야합니까? 예를 들어, gdplog(gdp)?

data =
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7

7
겹치는 부분이 분명히 있지만 "팬더의 열 이름 바꾸기"에서 이름 바꾸기를 위해 독방 열 요소를 선택할 수 있다는 것이 즉시 명확하지 않았습니다. 물론, 돌이켜 보면 분명히 알 수 있으며, 더 깊이 파고들었다면 아마 알아 냈을 것입니다. 그러나이 질문 / 답변이 그 점을 지적하는 것이 더 낫다고 생각합니다.
jeremiahbuddha

답변:


360
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

rename이의 PARAM로 DICT 받아들이는 쇼 columns당신은 단지 하나의 항목으로 DICT을 통과 할 수 있도록합니다.

관련 참조


3
이것은 큰 데이터 프레임에서 매우 오랜 시간이 걸리므로 메모리의 전체 데이터 프레임을 복사하는 데 도움이됩니까?
elgehelge

1
그것을하지 말아야 @elgehelge, 대부분의 팬더 작업이 사본을 반환하고 일부는 동의 inplace가이 PARAM 다음이이 버그가 무시 있다면, PARAM을, 당신이하고 PARAM없이 타이밍을 할 수있는, 또한 같은 것을 시도 new_df = df.rename(columns={'new_name':'old_name'})하고이 있는지 속도가 빠르다
EdChum

1
@ EdChum 감사합니다. inplace매개 변수를 제거하면 시간이 14 초에서 26 초로 거의 두 배가되었습니다. 그러나 헤더를 바꾸는 것만으로도 14 초가 여전히 오래
걸렸습니다

2
하나의 메모 만주의하십시오! 대상 열이 존재하지 않으면 (이름 철자 오류 등) 오류나 경고없이 아무 것도 수행하지 않습니다.
Amir

1
@Quastiat 목록 이해를 통해 이러한 간단한 op 중 일부가 더 빠른 이유가 다소 우울합니다. 기본적으로 매우 큰 df가 없으면 큰 df에서 많은 열의 이름을 바꾸지 않는 한 실제로 중요하지 않습니다.
EdChum

27

list-comprehension단일 열의 이름을 바꾸어야 할 경우 훨씬 빠른 구현이 사용 됩니다.

df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]

여러 열의 이름을 바꾸어야 할 경우 다음과 같은 조건식을 사용하십시오.

df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]

또는,를 사용하여 매핑을 구성 dictionary하고 수행 list-comprehension그것의에 get이전 이름으로 기본 값을 설정하여 운영 :

col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'}   ## key→old name, value→new name

df.columns = [col_dict.get(x, x) for x in df.columns]

타이밍 :

%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop

%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop

나는이 방법을 사용하고 싶지만 불행히도 그것이 pd.merge_asof()표현이기 때문에 작동하지 않습니다 :(.
thdoan

14

팬더에서 특정 열의 이름을 바꾸려면 어떻게합니까?

v0.24 이상에서 한 번에 하나 이상의 열 이름을 바꾸려면

한 번에 모든 열의 이름을 바꾸어야하는 경우

  • DataFrame.set_axis()와 방법 axis=1. 목록과 같은 순서를 전달하십시오. 전체 수정 옵션도 제공됩니다.

renameaxis=1

df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df

   y gdp cap
0  x   x   x
1  x   x   x
2  x   x   x
3  x   x   x
4  x   x   x

0.21+에서는 다음을 사용하여 axis매개 변수를 지정할 수 있습니다 rename.

df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
    
   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

( rename기본적으로 제자리에 있지 않으므로 결과를 다시 할당 해야합니다 .)

이 기능은 나머지 API와의 일관성을 향상시키기 위해 추가되었습니다. 새로운 axis인수는 columns매개 변수와 유사 하며 동일한 작업을 수행합니다.

df.rename(columns={'gdp': 'log(gdp)'})

   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

rename 또한 각 열에 대해 한 번 호출되는 콜백을 허용합니다.

df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')

   y  g  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

이 특정 시나리오의 경우

df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)

Index.str.replace

replace파이썬의 문자열 방법과 유사하게 , pandas Index and Series (객체 dtype 만) str.replace는 문자열 및 정규식 기반 대체를위한 ( "벡터화 된") 방법을 정의합니다 .

df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
 
   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

다른 방법에 str.replace비해이 방법의 장점 은 정규식 (기본적으로 활성화 됨) 을 지원 한다는 것 입니다. 자세한 내용은 문서를 참조하십시오.


에 목록을 전달 set_axisaxis=1

set_axis헤더 목록으로 전화하십시오 . 목록의 길이는 열 / 색인 크기와 같아야합니다. set_axis기본적으로 원본 DataFrame을 변경하지만 inplace=False수정 된 복사본을 반환하도록 지정할 수 있습니다 .

df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)

  cap log(gdp)  y
0   x        x  x
1   x        x  x
2   x        x  x
3   x        x  x
4   x        x  x

참고 : 이후 릴리스에서는 inplace기본값이로 설정됩니다 True.

Method Chaining
왜 ? set_axis를 사용하여 열을 효율적으로 할당 할 수있는 방법을 선택 해야 df.columns = ...합니까? [이 답변]에서 Ted Petrou가 보여준 것처럼 ( https://stackoverflow.com/a/46912050/4909087 ) set_axis은 메소드를 연결하려고 할 때 유용합니다.

비교

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

전자는 더 자연스럽고 자유롭게 흐르는 구문입니다.


3

팬더에서 특정 열의 이름을 바꾸는 방법에는 적어도 5 가지가 있으며 원래 답변에 대한 링크와 함께 아래에 나열했습니다. 또한이 방법의 시간을 정하고 데이터 세트와 시나리오에 따라 YMMV가 거의 동일하게 수행되는 것으로 나타났습니다. 아래의 테스트 케이스는 열 이름을 변경하는 것입니다 A M N ZA2 M2 N2 Z2열이있는 dataframe에 AZ백만 행을 포함.

# Import required modules
import numpy as np
import pandas as pd
import timeit

# Create sample data
df = pd.DataFrame(np.random.randint(0,9999,size=(1000000, 26)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))

# Standard way - https://stackoverflow.com/a/19758398/452587
def method_1():
    df_renamed = df.rename(columns={'A': 'A2', 'M': 'M2', 'N': 'N2', 'Z': 'Z2'})

# Lambda function - https://stackoverflow.com/a/16770353/452587
def method_2():
    df_renamed = df.rename(columns=lambda x: x + '2' if x in ['A', 'M', 'N', 'Z'] else x)

# Mapping function - https://stackoverflow.com/a/19758398/452587
def rename_some(x):
    if x=='A' or x=='M' or x=='N' or x=='Z':
        return x + '2'
    return x
def method_3():
    df_renamed = df.rename(columns=rename_some)

# Dictionary comprehension - https://stackoverflow.com/a/58143182/452587
def method_4():
    df_renamed = df.rename(columns={col: col + '2' for col in df.columns[
        np.asarray([i for i, col in enumerate(df.columns) if 'A' in col or 'M' in col or 'N' in col or 'Z' in col])
    ]})

# Dictionary comprehension - https://stackoverflow.com/a/38101084/452587
def method_5():
    df_renamed = df.rename(columns=dict(zip(df[['A', 'M', 'N', 'Z']], ['A2', 'M2', 'N2', 'Z2'])))

print('Method 1:', timeit.timeit(method_1, number=10))
print('Method 2:', timeit.timeit(method_2, number=10))
print('Method 3:', timeit.timeit(method_3, number=10))
print('Method 4:', timeit.timeit(method_4, number=10))
print('Method 5:', timeit.timeit(method_5, number=10))

산출:

Method 1: 3.650640267
Method 2: 3.163998427
Method 3: 2.998530871
Method 4: 2.9918436889999995
Method 5: 3.2436501520000007

가장 직관적이고 응용 프로그램에서 가장 쉽게 구현할 수있는 방법을 사용하십시오.

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