팬더에서 열 이름 바꾸기


1823

팬더와 열 레이블을 사용하는 DataFrame이 있는데 원래 열 레이블을 바꾸려면 편집해야합니다.

A원래 열 이름이 다음 과 같은 DataFrame 에서 열 이름을 변경하고 싶습니다 .

['$a', '$b', '$c', '$d', '$e'] 

['a', 'b', 'c', 'd', 'e'].

편집 한 열 이름을 목록에 저장했지만 열 이름을 바꾸는 방법을 모르겠습니다.


1
열 레이블 이름 바꾸기를 다루는 공식 문서를 확인하십시오. pandas.pydata.org/pandas-docs/stable/user_guide/text.html
ccpizza

답변:


1826

.columns속성에 지정하십시오 .

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

302
단일 열 헤더 이름을 변경할 수 있습니까?
ericmjl

112
@ericmjl : df의 첫 번째 변수 이름을 변경한다고 가정하십시오. 그러면 다음과 같은 작업을 수행 할 수 있습니다.new_columns = df.columns.values; new_columns[0] = 'XX'; df.columns = new_columns
cd98

54
외모 당신은 단순히 한 적이 있었던 것처럼 df.columns.values [0] = 'XX'
RAY

25
농담이야, @ 레이-하지마. 색인 이름이 열 이름을 저장하는 것과 무관하게 생성 된 목록 인 것 같습니다. ... 당신의 DF에 대한 열 이름을 파괴하는 멋진 작업을합니까
미치 아마

433
@ericmjl yesdf.rename(columns = {'$b':'B'}, inplace = True)
nachocab

2843

특정 열 이름 바꾸기

df.rename()함수를 사용하고 이름을 바꿀 열을 참조하십시오. 모든 열의 이름을 바꿀 필요는 없습니다.

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

최소 코드 예

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

다음 방법은 모두 작동하며 동일한 출력을 생성합니다.

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)  # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'})  # old method  

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

수정이 제자리에 있지 않으므로 결과를 다시 할당해야합니다. 또는 다음을 지정하십시오 inplace=True.

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

v0.25부터 errors='raise'유효하지 않은 열 이름 바꾸기가 지정된 경우 오류를 발생 시키도록 지정할 수도 있습니다 . v0.25 rename()문서를 참조하십시오 .


재 할당 열 헤더

사용 df.set_axis()axis=1inplace=False(사본을 반환).

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

이렇게하면 복사본이 반환되지만 설정을 통해 DataFrame을 내부에서 수정할 수 있습니다 inplace=True(버전 <= 0.24의 기본 동작이지만 향후 변경 될 수 있음).

헤더를 직접 할당 할 수도 있습니다.

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

2
I는 6 열의 데이터 프레임 (dataframe <ENTER>를 눌러) 약식 표현이 작업을 수행 할 때 : code<클래스 'pandas.core.frame.DataFrame'> Int64Index 1000 개 항목 0-999 데이터 열 : BodyMarkdown 1,000 비 - 널 code작품 하지만 dataframe.head ()를 수행하면 열의 이전 이름이 다시 나타납니다.
darKoram

12
SettingWithCopyWarning:이 답변에서 두 번째 코드 스 니펫을 사용 하면 두려워 합니다.
Monica Heddneck

정규식 대체 버전이 있습니까?
denfromufa

@lexual 기존의 두 열의 이름이 같은 경우 어떻게합니까? 이전 열 이름을 어떻게 참조합니까?
vagabond

14
첫 번째 해결책 : df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})표시된 이름을 변경하지만 기본 데이터 구조의 요소는 변경 하지 않습니다 . 따라서 시도 df['newName1']하면 오류가 발생합니다. 는 inplace=True그 gotchya를 방지하는 것이 필요하다.
irritable_phd_syndrom

402

rename메소드는 다음과 같은 함수를 사용할 수 있습니다 .

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

56
좋은. 이것은 나의 하루를 구했다 :df.rename(columns=lambda x: x.lstrip(), inplace=True)
root-11

2
@ root-11과 비슷합니다. 필자의 경우 IPython 콘솔 출력에 인쇄되지 않은 글 머리 기호 문자가 있었으므로 공백 (스트라이프) 이상을 제거해야했습니다.t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
The Red Pea

9
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)우리가 쓰는 df.Column_1_Name대신 쓸 수 있도록 보석 df.loc[:, 'Column 1 Name']입니다.
Little Bobby Tables


163

팬더 0.21+ 답변

버전 0.21의 컬럼 이름 변경에 대한 중요한 업데이트가 있습니다.

  • rename방법axis매개 변수를 추가 했습니다.columns 또는1 . 이 업데이트는이 메소드가 나머지 팬더 API와 일치하도록합니다. 그것은 여전히 가지고 indexcolumns 매개 변수가 있지만 더 이상 사용하지 않아도됩니다.
  • set_axis방법inplace세트에 False당신이 목록의 모든 인덱스 또는 열 레이블의 이름을 변경 할 수 있습니다.

팬더 0.21+의 예

샘플 DataFrame을 생성하십시오.

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

사용 rename으로 axis='columns'또는axis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

또는

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

두 가지 모두 결과는 다음과 같습니다.

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

이전 메소드 서명을 계속 사용할 수 있습니다.

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

rename함수는 각 열 이름에 적용될 함수도 허용합니다.

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

또는

df.rename(lambda x: x[1:], axis=1)

사용 set_axis목록과 함께inplace=False

set_axis열 수 (또는 인덱스)와 길이가 같은 메소드에 목록을 제공 할 수 있습니다 . 현재 inplace기본값은 True이지만 이후 릴리스에서는 inplace기본값이 False됩니다.

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

또는

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

왜 사용하지 df.columns = ['a', 'b', 'c', 'd', 'e'] 않습니까?

이와 같이 열을 직접 할당하는 데 아무런 문제가 없습니다. 완벽하게 좋은 솔루션입니다.

사용의 이점은 set_axis메소드 체인의 일부로 사용될 수 있으며 DataFrame의 새 사본을 리턴한다는 것입니다. 이것이 없으면 열을 다시 할당하기 전에 체인의 중간 단계를 다른 변수에 저장해야합니다.

# 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()

1
고맙습니다 Pandas 0.21+ answer-어떻게 든 "새로운 기능"부분에서 그 부분을 놓쳤습니다.
MaxU

1
해결책은 Pandas 3.6에서 작동하지 않는 것 같습니다. df.rename ({ '$ a': 'a', '$ b': 'b', '$ c': 'c', '$ d': 'd ','$ e ':'e '}, axis ='columns '). 예기치 않은 키워드 인수 "axis"를 얻습니다
Arthur D. Howland

3
df.columns = [ 'a', 'b', 'c', 'd', 'e']는 더 이상 작동하지 않는 것 같습니다. 버전 0.22로 작업하면 Pandas에서 열을 만들 수 없다는 경고 가 있습니다. 새로운 속성 이름 . 모든 열의 이름이 같은 경우 이름을 바꾸는 방법 : /
Nabla

미리 열의 이름을 모르고 색인 만 알면 하나, 여러 또는 모든 열의 이름을 바꾸는 방법이 있습니까? 감사!
tommy.carstensen

이것은 매우 유용한 의견이었습니다. 예를 들어, 람다 함수는 다음을 수행하는 방법에 대한 내 질문에 대답했습니다.(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
measure allthethings

131

모든 열 이름에서 $ 기호 만 제거하려고하므로 다음과 같이하면됩니다.

df = df.rename(columns=lambda x: x.replace('$', ''))

또는

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

1
이것은 OP의 경우뿐만 아니라 일반적인 요구 사항에도 도움이됩니다. 예 : 열 이름을 구분 기호로 나누고 그 일부를 사용합니다.
Deepak


61
old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

이 방법으로 new_names원하는대로 수동으로 편집 할 수 있습니다 . 잘못된 철자, 악센트, 특수 문자 등을 제거하기 위해 몇 개의 열만 이름을 바꾸어야 할 때 효과적입니다.


1
이 방법이 마음에 들지만 df.columns = ['a', 'b', 'c', 'd', 'e']더 간단 하다고 생각 합니다.
Christopher Pearson

1
나는 오래된 이름과 새로운 이름을 압축하는이 방법을 좋아합니다. df.columns.values이전 이름을 얻는 데 사용할 수 있습니다 .
bkowshik

1
테이블 형식의 뷰를 표시하고 열을 old_names에 복사합니다. 요구 사항 배열을 new_names에 복사합니다. 그런 다음 dict (zip (old_names, new_names)) 매우 우아한 솔루션을 사용하십시오.
mythicalcoder

나는 종종 다음과 같은 목록의 하위 집합을 사용 myList = list(df) myList[10:20]하므로 완벽합니다.
Tim Gottgetreu

@bkowshik 제안 베스트는 편집 그들과 재 삽입 그들, 즉, 이전의 이름을 촬영 namez = df.columns.values한 후, 일부 편집 다음 df.columns = namez.
pauljohn32

34

한 라인 또는 파이프 라인 솔루션

두 가지에 중점을 둘 것입니다.

  1. OP는 명확하게 말한다

    편집 한 열 이름을 목록에 저장했지만 열 이름을 바꾸는 방법을 모르겠습니다.

    '$'각 열 머리글에서 첫 번째 문자 를 바꾸 거나 제거하는 방법의 문제를 해결하고 싶지 않습니다 . OP는 이미이 단계를 수행했습니다. 대신 기존 columns개체를 대체 열 이름 목록이 지정된 새 개체로 바꾸는 데 집중하고 싶습니다 .

  2. df.columns = newnew새 열 이름의 목록은 어디서나 간단합니다. 이 방법의 단점은 기존 데이터 프레임의 columns속성을 편집해야하며 인라인으로 수행되지 않는다는 것입니다. 기존 데이터 프레임을 편집하지 않고 파이프 라이닝을 통해이를 수행하는 몇 가지 방법을 보여 드리겠습니다.


설정 1
기존 열 목록으로 바꾸기 열 이름의 이름을 바꾸어야하는 필요성에 초점을 맞추기 위해 df초기 열 이름과 관련이없는 새 열 이름을 사용하여 새 샘플 데이터 프레임 을 만듭니다 .

df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']

df

   Jack  Mahesh  Xin
0     1       3    5
1     2       4    6

해결책 1
pd.DataFrame.rename

이미 이전 열 이름을 새 열 이름에 매핑하는 사전 이 있다면 사용할 수 있다고합니다 pd.DataFrame.rename.

d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)

   x098  y765  z432
0     1     3     5
1     2     4     6

그러나 해당 사전을 쉽게 만들고에 대한 호출에 포함 할 수 있습니다 rename. 다음은 반복 할 때 df각 열 이름을 반복 한다는 사실을 활용합니다 .

# given just a list of new column names
df.rename(columns=dict(zip(df, new)))

   x098  y765  z432
0     1     3     5
1     2     4     6

원래 열 이름이 고유 한 경우 효과적입니다. 그러나 그들이 그렇지 않다면, 이것은 무너집니다.



고유하지 않은 열 2 개 설정

df = pd.DataFrame(
    [[1, 3, 5], [2, 4, 6]],
    columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']

df

   Mahesh  Mahesh  Xin
0       1       3    5
1       2       4    6

해결 방법 2
pd.concat 사용keys인수

먼저 솔루션 1을 사용하려고 할 때 어떤 일이 발생하는지 확인하십시오.

df.rename(columns=dict(zip(df, new)))

   y765  y765  z432
0     1     3     5
1     2     4     6

new리스트를 열 이름으로 맵핑하지 않았습니다 . 우리는 반복했다 y765. 대신 의 열을 반복하면서 함수 의 keys인수를 사용할 수 있습니다 .pd.concatdf

pd.concat([c for _, c in df.items()], axis=1, keys=new) 

   x098  y765  z432
0     1     3     5
1     2     4     6

해결 방법 3
재구성. dtype모든 열에 대해 단일이있는 경우에만 사용해야합니다 . 그렇지 않으면, 당신은 결국dtype object 모든 열 다시 변환하려면 더 많은 사전 작업이 필요합니다.

단일 dtype

pd.DataFrame(df.values, df.index, new)

   x098  y765  z432
0     1     3     5
1     2     4     6

혼합 dtype

pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

해결 방법 4 and
의 특수 효과입니다 . 인덱스를 인라인으로 설정할 수 있지만 해당하는 것은 없습니다 . 따라서 다시 전치 한 다음 다시 전치 할 수 있습니다 . 그러나 동일한 단일 대 혼합transposeset_indexpd.DataFrame.set_indexset_columnsset_indexdtypedtype 솔루션 3 경고가 여기에 적용됩니다.

단일 dtype

df.T.set_index(np.asarray(new)).T

   x098  y765  z432
0     1     3     5
1     2     4     6

혼합 dtype

df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

솔루션 5 각 요소를 순환
하는 a lambda를 사용합니다 .이 솔루션에서는 람다를 전달 하지만 무시합니다. 또한 걸리지 만 기대하지는 않습니다. 대신, 반복자가 기본값으로 제공되며 그 값이 무엇인지에 관계없이 한 번에 하나씩 순환하는 데 사용할 수 있습니다 .pd.DataFrame.renamenew
xyx

df.rename(columns=lambda x, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

그리고 파이썬 채팅 에서 사람들이 나에게 지적한 것처럼 and *사이 에 in을 추가하면 변수를 보호 할 수 있습니다 . 그러나이 맥락에서 나는 그것이 보호가 필요하다고 생각하지 않습니다. 여전히 언급 할 가치가 있습니다.xyy

df.rename(columns=lambda x, *, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

아마도 다음과 같이 추가 할 수 있습니다.df.rename(lambda x : x.lstrip('$'),axis=1)
YOBEN_S

안녕하세요 @piRSquared, 솔루션 5에서 팬더가 람다 기능을 사용하는 방법에 대해 자세히 설명해 주시겠습니까? 나는 당신 x이 무시 한다고 말할 때 당신이 의미하는 바를 따르지 않습니까?
Josmoor98 19

33

열 이름 대 계열 이름

장면 뒤에서 일어나는 일에 대해 조금 설명하고 싶습니다.

데이터 프레임은 일련의 시리즈입니다.

차례로 시리즈는 numpy.array

numpy.array의 재산이있다 .name

이것은 시리즈의 이름입니다. 팬더 가이 속성을 존중하는 것은 드물지만 장소에 머무르며 팬더 행동을 해킹하는 데 사용할 수 있습니다.

열 목록 이름 지정

여기에 많은 답변이 df.columns속성이 list실제로 언제인지에 대해 이야기 합니다 Series. 이는 .name속성 이 있음을 의미 합니다.

이것은 열 이름을 채우기로 결정한 경우에 발생합니다 Series.

df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index       
0                                    4           1
1                                    5           2
2                                    6           3

색인 이름은 항상 한 열 아래로 내려옵니다.

남아있는 유물

.name속성은 때때로에 남아있다. 설정 df.columns = ['one', 'two']하면가 df.one.name됩니다 'one'.

를 설정하면 df.one.name = 'three'다음 df.columns아직도 당신을 줄 것이다 ['one', 'two'], 그리고df.one.name 당신에게 줄 것이다'three'

그러나

pd.DataFrame(df.one) 돌아올 것이다

    three
0       1
1       2
2       3

팬더는 .name이미 정의 된 의 를 재사용하기 때문 입니다 Series.

다단계 열 이름

팬더는 다중 계층 열 이름을 수행하는 방법이 있습니다. 너무 많은 마술이 포함되어 있지 않지만 여기에 사람이있는 것을 보지 못했기 때문에이 답변을 다루고 싶었습니다.

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

다음과 같이 열을 목록으로 설정하면 쉽게 달성 할 수 있습니다.

df.columns = [['one', 'one'], ['one', 'two']]

18

데이터 프레임이 있으면 df.columns는 모든 것을 목록으로 덤프하여 조작 한 다음 데이터 프레임에 열 이름으로 다시 할당합니다.

columns = df.columns
columns = [row.replace("$","") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() #to validate the output

가장 좋은 방법은? IDK. 방법-네

질문에 대한 답변에서 제시된 모든 주요 기술을 평가하는 더 좋은 방법은 cProfile을 사용하여 메모리 및 실행 시간을 측정하는 것입니다. @kadee, @kaitlyn, & @eumiro는 가장 빠른 실행 시간을 가진 함수를 가졌습니다.이 함수는 너무 빠르지 만 모든 답에 대해 .000 초와 .001 초의 반올림을 비교합니다. 도덕 : 위의 대답은 '최상의'방법이 아닐 것입니다.

import pandas as pd
import cProfile, pstats, re

old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b','$c':'c','$d':'d','$e':'e'}

df = pd.DataFrame({'$a':[1,2], '$b': [10,20],'$c':['bleep','blorp'],'$d':[1,2],'$e':['texa$','']})

df.head()

def eumiro(df,nn):
    df.columns = nn
    #This direct renaming approach is duplicated in methodology in several other answers: 
    return df

def lexual1(df):
    return df.rename(columns=col_dict)

def lexual2(df,col_dict):
    return df.rename(columns=col_dict, inplace=True)

def Panda_Master_Hayden(df):
    return df.rename(columns=lambda x: x[1:], inplace=True)

def paulo1(df):
    return df.rename(columns=lambda x: x.replace('$', ''))

def paulo2(df):
    return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

def migloo(df,on,nn):
    return df.rename(columns=dict(zip(on, nn)), inplace=True)

def kadee(df):
    return df.columns.str.replace('$','')

def awo(df):
    columns = df.columns
    columns = [row.replace("$","") for row in columns]
    return df.rename(columns=dict(zip(columns, '')), inplace=True)

def kaitlyn(df):
    df.columns = [col.strip('$') for col in df.columns]
    return df

print 'eumiro'
cProfile.run('eumiro(df,new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df,col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df,old_names,new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')

왜 이름 바꾸기 방법이 필요합니까? # df.columns = [df.columns의 행에 대한 row.replace ( '$', '')]
shantanuo

나는 '사물'부분을 이해하지 못합니다. 무엇을 대체해야합니까? 오래된 기둥?
Andrea Ianni ௫

18

이것이 데이터 프레임이라고 가정 해 봅시다.

여기에 이미지 설명을 입력하십시오

두 가지 방법을 사용하여 열의 이름을 바꿀 수 있습니다.

  1. 사용 dataframe.columns=[#list]

    df.columns=['a','b','c','d','e']

    여기에 이미지 설명을 입력하십시오

    이 방법의 한계는 하나의 열을 변경해야하는 경우 전체 열 목록을 전달해야한다는 것입니다. 또한이 방법은 색인 레이블에는 적용되지 않습니다. 예를 들어, 이것을 전달한 경우 :

    df.columns = ['a','b','c','d']

    오류가 발생합니다. 길이 불일치 : 예상 축에 5 개의 요소가 있고 새 값에 4 개의 요소가 있습니다.

  2. 또 다른 방법은 rename()인덱스, 열 또는 행의 이름을 바꾸는 데 사용되는 Pandas 방법입니다.

    df = df.rename(columns={'$a':'a'})

    여기에 이미지 설명을 입력하십시오

마찬가지로 행이나 열을 변경할 수 있습니다.


17
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})

새 열 목록이 기존 열과 동일한 순서 인 경우 할당이 간단합니다.

new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
   a  b  c  d  e
0  1  1  1  1  1

이전 열 이름을 새 열 이름으로 입력 한 사전이있는 경우 다음을 수행 할 수 있습니다.

d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col])  # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
   a  b  c  d  e
0  1  1  1  1  1

목록 또는 사전 매핑이없는 경우 $목록 이해를 통해 선행 기호를 제거 할 수 있습니다 .

df.columns = [col[1:] if col[0] == '$' else col for col in df]

2
대신에 lambda col: d[col]당신이 통과 할 수 d.get... 그래서 같을 것이다df.columns.map(d.get)
piRSquared


15

작은 예제로 이름 바꾸기를 이해합시다 ...

1. 매핑을 사용하여 열 이름 바꾸기 :

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) #creating a df with column name A and B
df.rename({"A": "new_a", "B": "new_b"},axis='columns',inplace =True) #renaming column A with 'new_a' and B with 'new_b'

output:
   new_a  new_b
0  1       4
1  2       5
2  3       6

2. 매핑을 사용하여 인덱스 / 행 이름 바꾸기 :

df.rename({0: "x", 1: "y", 2: "z"},axis='index',inplace =True) #Row name are getting replaced by 'x','y','z'.

output:
       new_a  new_b
    x  1       4
    y  2       5
    z  3       6

가장 많이
찬성 된

14

원래 열 레이블을 바꾸는 또 다른 방법은 원래 열 레이블에서 원하지 않는 문자 (여기서 '$')를 제거하는 것입니다.

이것은 df.columns에서 for 루프를 실행하고 제거 된 열을 df.columns에 추가하여 수행 할 수 있습니다.

대신 아래와 같이 목록 이해를 사용하여 단일 명령문으로 깔끔하게 수행 할 수 있습니다.

df.columns = [col.strip('$') for col in df.columns]

( strip파이썬의 메소드는 문자열의 시작과 끝에서 주어진 문자를 제거합니다.)


2
이것이 어떻게 / 왜 작동하는지 설명 할 수 있습니까? 그것은 미래 독자들에게 답을 더 가치있게 만들 것입니다.
Dan Lowe

12

정말 간단한 사용

df.columns = ['Name1', 'Name2', 'Name3'...]

열 순서대로 열 이름을 지정합니다.


10

당신은 str.slice그것을 위해 사용할 수 있습니다 :

df.columns = df.columns.str.slice(1)

1
추신 : 이것은 더 장황한 df.columns.str[1:]것입니다 ... 아마 더 잘 사용하면 더 짧고 분명합니다.
cs95

9

나는이 질문과 대답이 죽었다는 것을 알고있다. 그러나 나는 내가 겪고있는 문제 중 하나에 대한 영감을 얻었습니다. 다른 답변의 비트와 조각을 사용하여 문제를 해결할 수 있었으므로 누구나 필요할 때 내 답변을 제공했습니다.

내 방법은 일반적 delimiters=이며 변수 를 쉼표로 구분하여 미래에 대비 하여 추가 구분 기호를 추가 할 수 있습니다 .

근무 코드 :

import pandas as pd
import re


df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

산출:

>>> df
   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

>>> df
   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

8

이 방법은 MultiIndex에는 작동하지 않습니다. 다중 인덱스의 경우 다음과 같은 작업을 수행해야합니다.

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

8

또 다른 옵션은 정규식을 사용하여 이름을 바꾸는 것입니다.

import pandas as pd
import re

df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})

df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

6

제어 시스템에서 제공 시스템에 의해 명명 된 많은 열을 처리 해야하는 경우 일반적인 접근 방식과 특정 대체 방법을 한 번에 조합 한 다음 접근 방식을 생각해 냈습니다.

먼저 정규식을 사용하여 데이터 프레임 열 이름에서 사전을 생성 한 다음 열 이름의 특정 부록을 버리고 수신 데이터베이스에서 나중에 예상되는대로 코어 열의 이름을 지정하기 위해 사전에 특정 대체를 추가하십시오.

그런 다음 한 번에 데이터 프레임에 적용됩니다.

dict=dict(zip(df.columns,df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)','')))
dict['brand_timeseries:C1']='BTS'
dict['respid:L']='RespID'
dict['country:C1']='CountryID'
dict['pim1:D']='pim_actual'
df.rename(columns=dict, inplace=True)

5

이미 제공된 솔루션 외에도 파일을 읽는 동안 모든 열을 바꿀 수 있습니다. 사용할 수 names있고header=0 그렇게 할 수 있습니다.

먼저 열 이름으로 사용하려는 이름 목록을 만듭니다.

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

이 경우 모든 열 이름이 목록에있는 이름으로 바뀝니다.


4

다음은 타이핑을 줄이는 데 사용하는 멋진 작은 기능입니다.

def rename(data, oldnames, newname): 
    if type(oldnames) == str: #input can be a string or list of strings 
        oldnames = [oldnames] #when renaming multiple columns 
        newname = [newname] #make sure you pass the corresponding list of new names
    i = 0 
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0: 
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: #doesn't have to be an exact match 
            print("Found multiple columns that matched " + str(name) + " :")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1 
    return data   

작동 방식의 예는 다음과 같습니다.

In [2]: df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['col1','col2','omg','idk'])
#first list = existing variables
#second list = new names for those variables
In [3]: df = rename(df, ['col','omg'],['first','ohmy']) 
Found multiple columns that matched col :
0: col1
1: col2

please enter the index of the column you would like to rename: 0

In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')

1
이와 같은 기능의 사용 사례는 매우 드 rare니다. 대부분의 경우, 내가 찾고있는 것과 이름을 바꾸려는 것을 알고 있습니다. 직접 할당하거나 수정하고 싶습니다.
cs95

1
@ cs95 나는 응답 옵션, 리 커트 척도 및 분기 (예 : EDU_2913.443, EDU_2913.421 등)에 따라 접두사로 시작하는 코딩 된 변수 이름을 갖는 대규모 국가 또는 국제 측량에서 일하는 경향이 있습니다. 이 기능은, 내가 :)이 아니 당신을 위해 생각하면 이해 세트 이러한 유형의 작업에 나에게 매우 유용했습니다
seeiespi

3

팬더에서 열 이름을 바꾸는 것은 쉬운 일입니다.

df.rename(columns = {'$a':'a','$b':'b','$c':'c','$d':'d','$e':'e'},inplace = True)

2

정규식을 사용할 수 있다고 가정합니다. 이 솔루션은 정규식을 사용하여 수동 인코딩이 필요하지 않습니다.

import pandas as pd
import re

srch=re.compile(r"\w+")

data=pd.read_csv("CSV_FILE.csv")
cols=data.columns
new_cols=list(map(lambda v:v.group(),(list(map(srch.search,cols)))))
data.columns=new_cols

2
솔루션이 왜 작동해야하는지 또는 기존 솔루션보다 나은지에 대한 설명을 추가하는 것이 Stack Overflow의 모범 사례입니다. 자세한 내용은 답변 방법을 참조하십시오 .
Samuel Liew

최고 등급의 답변에는 어떤 형태의 하드 코딩이 필요하고 최악의 등급의 답변에는 설명적이고 절차적인 접근 방식 만 필요합니까?
Kaustubh J

이것보다 정규식을 사용하는 더 나은 (더 읽기 쉬운) 솔루션이 있습니다. 이것은 간단한 이름 바꾸기 작업보다 더 많은 작업을 수행하고 있습니다. 패턴이 어떤 것과도 일치하지 않을 위험이 있으며,이 경우 오류 처리를 위해 아무것도하지 않았습니다.
cs95
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.