etc./StackOverFlow

Pandas에서 열 이름 바꾸기

청렴결백한 만능 재주꾼 2021. 11. 25. 06:53
반응형

질문자 :user1504276


원래 열 레이블을 바꾸기 위해 편집해야 하는 Pandas 및 열 레이블을 사용하는 DataFrame이 있습니다.

원래 열 이름이 다음 A 의 열 이름을 변경하고 싶습니다.

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

에게

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

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



특정 열 이름 바꾸기

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 abcde 0 xxxxx 1 xxxxx 2 xxxxx

다음 메서드는 모두 작동하고 동일한 출력을 생성합니다.

 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 XY cde 0 xxxxx 1 xxxxx 2 xxxxx

수정 사항이 제자리에 있지 않으므로 결과를 다시 할당해야 합니다. inplace=True 지정합니다.

 df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True) df XY cde 0 xxxxx 1 xxxxx 2 xxxxx

v0.25부터는 이름을 바꿀 잘못된 열이 지정된 경우 오류를 발생시키기 위해 errors errors='raise' 를 지정할 수도 있습니다. v0.25 rename() 문서를 참조하십시오.


열 헤더 재할당

axis=1inplace=False (사본을 반환하려면)와 함께 df.set_axis() 를 사용하십시오.

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

inplace=True 를 설정하여 DataFrame을 제자리에서 수정할 수 있습니다(버전 <=0.24의 기본 동작이지만 향후 변경될 수 있음).

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

 df.columns = ['V', 'W', 'X', 'Y', 'Z'] df VWXYZ 0 xxxxx 1 xxxxx 2 xxxxx

lexual

.columns 속성에 할당하기만 하면 됩니다.

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

eumiro

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)

Andy Hayden

텍스트 데이터 작업에 설명된 대로:

 df.columns = df.columns.str.replace('$', '')

kadee

팬더 0.21+ 답변

버전 0.21에서 열 이름 바꾸기에 대한 몇 가지 중요한 업데이트가 있습니다.

  • rename 방법 columns 또는 1 로 설정할 수 있는 axis 매개변수를 추가했습니다. 이 업데이트는 이 메서드가 나머지 pandas API와 일치하도록 합니다. 여전히 indexcolumns 매개변수가 있지만 더 이상 사용하지 않아도 됩니다.
  • inplaceFalse set_axis 메서드 를 사용하면 목록이 있는 모든 인덱스 또는 열 레이블의 이름을 바꿀 수 있습니다.

판다 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

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

 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)

둘 다 다음과 같은 결과를 가져옵니다.

 abcde 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)

목록 및 inplace=False set_axis 사용

열(또는 인덱스) 수와 길이가 동일한 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()

Ted Petrou

모든 열 이름에서 $ 기호만 제거하고 싶기 때문에 다음을 수행할 수 있습니다.

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

또는

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

paulo.filip3

Pandas에서 열 이름을 바꾸는 것은 쉬운 작업입니다.

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

Nirali Khoda

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

기존 이름을 제공한 순서대로 제공한 이름으로 대체합니다.


M PAUL

사용하다:

 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 를 수동으로 편집할 수 있습니다. 철자 오류, 악센트를 수정하고 특수 문자를 제거하는 등 몇 개의 열 이름만 바꿔야 할 때 유용합니다.


migloo

단일 라인 또는 파이프라인 솔루션

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

  1. OP는 분명히 말합니다.

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

    '$' 를 대체하거나 각 열 헤더의 첫 번째 문자를 제거하는 방법의 문제를 해결하고 싶지 않습니다. OP는 이미 이 단계를 완료했습니다. columns 개체를 대체 열 이름 목록이 제공된 새 개체로 바꾸는 데 중점을 두고 싶습니다.

  2. df.columns = new 여기서 new 는 새 열 이름 목록을 얻는 것처럼 간단합니다. 이 접근 방식의 단점은 기존 데이터 프레임의 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
keys 인수를 사용하는 pd.concat

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

 df.rename(columns=dict(zip(df, new))) y765 y765 z432 0 1 3 5 1 2 4 6

new 목록을 열 이름으로 매핑하지 않았습니다. 우리는 결국 y765 를 반복했습니다. df 의 열을 반복하면서 pd.concat keys 인수를 사용할 수 있습니다.

 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 이 있는 경우에만 사용해야 합니다. 그렇지 않으면 object dtype 다시 변환하려면 더 많은 사전 작업이 필요합니다.

단일 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
transposeset_index 사용하는 변칙적인 트릭입니다. pd.DataFrame.set_index 사용하면 인덱스를 인라인으로 설정할 수 있지만 해당하는 set_columns 가 없습니다. 그래서 우리는 전치한 다음 set_index 하고 다시 전치할 수 있습니다. 그러나 솔루션 3의 동일한 단일 dtype 대 혼합 dtype 경고가 여기에 적용됩니다.

단일 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
new 각 요소를 순환하는 pd.DataFrame.rename lambda 를 사용하십시오.
x 를 취하지만 무시하는 람다를 전달합니다. 또한 y 하지만 기대하지 않습니다. x 값이 무엇인지에 관계없이 한 번에 하나씩 순환하는 데 사용할 수 있습니다.

 df.rename(columns=lambda x, y=iter(new): next(y)) x098 y765 z432 0 1 3 5 1 2 4 6

그리고 sopython chat 의 사람들이 나에게 지적했듯이 xy 사이에 * 를 추가하면 y 변수를 보호할 수 있습니다. 그러나 이 맥락에서 나는 그것이 보호할 필요가 있다고 생각하지 않습니다. 여전히 언급할 가치가 있습니다.

 df.rename(columns=lambda x, *, y=iter(new): next(y)) x098 y765 z432 0 1 3 5 1 2 4 6

piRSquared

열 이름 대 시리즈 이름

나는 무대 뒤에서 일어나는 일을 조금 설명하고 싶습니다.

데이터 프레임은 시리즈의 집합입니다.

시리즈는 차례로 numpy.array 의 확장입니다.

numpy.array .name 속성이 있습니다.

이것은 시리즈의 이름입니다. Pandas가 이 속성을 존중하는 경우는 거의 없지만 이 속성은 어딘가에 남아 있으며 일부 Pandas 동작을 해킹하는 데 사용될 수 있습니다.

열 목록 이름 지정

여기에서 많은 답변이 df.columns 속성이 실제로 Series list 이 되는 것에 대해 이야기합니다. .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 하면 df.columns 는 여전히 ['one', 'two'] 를 제공하고 df.one.name 'three' 제공합니다.

하지만

pd.DataFrame(df.one) 이 반환됩니다.

 three 0 1 1 2 2 3

Pandas는 이미 정의된 Series .name 을 재사용하기 때문입니다.

다단계 열 이름

Pandas에는 다중 계층 열 이름을 수행하는 방법이 있습니다. 그다지 많은 마술이 관련되어 있지는 않지만 여기에서 이것을 선택하는 사람을 볼 수 없기 때문에 내 대답에서도 이것을 다루고 싶었습니다.

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

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

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

firelynx

작은 예를 들어 이름 바꾸기를 이해 합시다 ...

  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. 매핑을 사용하여 index/Row_Name 이름 바꾸기:

     df.rename({0: "x", 1: "y", 2: "z"}, axis='index', inplace =True) # Row name are getting replaced by 'x', 'y', and 'z'. Output: new_a new_b x 1 4 y 2 5 z 3 6

Amar Kumar

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

여기에 이미지 설명 입력

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

  1. dataframe.columns=[#list]

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

    여기에 이미지 설명 입력

    이 방법의 한계는 하나의 열을 변경해야 하는 경우 전체 열 목록을 전달해야 한다는 것입니다. 또한 이 방법은 인덱스 레이블에 적용할 수 없습니다. 예를 들어 다음을 통과한 경우:

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

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

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

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

    여기에 이미지 설명 입력

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


vibhu_singh

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 abcde 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 abcde 0 1 1 1 1 1

목록 또는 사전 매핑이 없는 경우 목록 이해를 통해 $

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

Alexander

데이터 프레임이 있는 경우 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

가장 좋은 방법은? 모르겠어요. 방법 - 예.

질문에 대한 답변에 제시된 모든 주요 기술을 평가하는 더 좋은 방법은 아래에서 cProfile을 사용하여 메모리와 실행 시간을 측정하는 것입니다. @kadee, @kaitlyn 및 @eumiro는 실행 시간이 가장 빠른 함수를 가지고 있습니다. 이 함수가 너무 빠르긴 하지만 모든 답변에 대해 0.000초와 0.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)')

andrewwowens

df.rename(index=str, columns={'A':'a', 'B':'b'})

팬더.DataFrame.이름 바꾸기


Yog

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

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

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

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

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


kait

정말 간단합니다. 그냥 사용:

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

그리고 입력한 순서대로 열 이름을 할당합니다.


Thodoris P

str.slice 위해 str.slice를 사용할 수 있습니다.

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

Anton Protopopov

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

 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 abc 0 1 3 5 1 2 4 6

sbha

delimiters= variable을 구분하고 미래에 대비할 수 있도록 쉼표로 구분자를 추가할 수 있는 일반적인 방법입니다.

작업 코드:

 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 abcde 0 1 3 5 7 9 1 2 4 6 8 10

Anil_M

이전 답변의 접근 방식은 MultiIndex 에서는 작동하지 않습니다. MultiIndex 의 경우 다음과 같은 작업을 수행해야 합니다.

 >>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]}) >>> df $a $be $x $yf 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 abe xyf 0 1 3 5 1 2 4 6

oxer

제공 시스템에서 이름을 지정한 많은 열을 제어할 수 없는 경우 처리해야 하는 경우 일반적인 접근 방식과 특정 대체 방식을 한 번에 결합한 다음 접근 방식을 생각해 냈습니다.

먼저 정규 표현식을 사용하여 데이터 프레임 열 이름에서 사전을 생성하여 열 이름의 특정 부록을 제거한 다음 사전에 특정 대체를 추가하여 나중에 수신 데이터베이스에서 예상대로 핵심 열의 이름을 지정합니다.

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

 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)

matthhias

이미 제공된 솔루션 외에도 파일을 읽는 동안 모든 열을 바꿀 수 있습니다. namesheader=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)

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


Stryker

많은 pandas 함수에는 inplace 매개변수가 있습니다. True로 설정하면 변환이 호출하는 데이터 프레임에 직접 적용됩니다. 예를 들어:

 df = pd.DataFrame({'$a':[1,2], '$b': [3,4]}) df.rename(columns={'$a': 'a'}, inplace=True) df.columns >>> Index(['a', '$b'], dtype='object')

또는 원본 데이터 프레임을 보존하려는 경우가 있습니다. 데이터 프레임을 만드는 것이 비용이 많이 드는 작업인 경우 사람들이 이 경우에 빠지는 것을 종종 보았습니다. 예를 들어 데이터 프레임을 생성하려면 눈송이 데이터베이스를 쿼리해야 합니다. 이 경우 inplace 매개변수가 False로 설정되어 있는지 확인하십시오.

 df = pd.DataFrame({'$a':[1,2], '$b': [3,4]}) df2 = df.rename(columns={'$a': 'a'}, inplace=False) df.columns >>> Index(['$a', '$b'], dtype='object') df2.columns >>> Index(['a', '$b'], dtype='object')

이러한 유형의 변환이 자주 수행하는 작업인 경우 다양한 판다 GUI 도구를 살펴볼 수도 있습니다. 저는 Mito 라는 이름을 만든 사람입니다. 편집 내용을 Python 코드로 자동 변환하는 스프레드시트입니다.


Aaron Diamond-Reivich

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

 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')

seeiespi

정규식을 사용할 수 있다고 가정하면 이 솔루션 정규식을 사용하여 수동으로 인코딩할 필요가 없습니다.

 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

Kaustubh J

XGBoost에 대한 기능의 이름을 변경해야 했지만 다음 중 하나가 마음에 들지 않았습니다.

 import re regex = r"[!\"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~ ]+" X_trn.columns = X_trn.columns.str.replace(regex, '_', regex=True) X_tst.columns = X_tst.columns.str.replace(regex, '_', regex=True)

Igor Ostaptchenko

새 열 이름에 대한 목록이 이미 있는 경우 다음을 시도할 수 있습니다.

 new_names = ['a', 'b', 'c', 'd', 'e'] new_names_map = {df.columns[i]:new_cols[i] for i in range(len(new_cols))} df.rename(new_names_map, axis=1, inplace=True)

Crystal L

'$'기호를 제거하려면 아래 코드를 사용하십시오.

 df.columns = pd.Series(df.columns.str.replace("$", ""))

Omkar Darves

출처 : http:www.stackoverflow.com/questions/11346283/renaming-column-names-in-pandas

반응형