python - 프레임 - 판다 스 열 인덱싱




판다에서 열 이름 바꾸기 (19)

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

DataFrame에서 원래 열 이름이있는 열 이름을 변경하고 싶습니다.

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

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

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


DataFrame - df.rename ()이 작동합니다.

df.rename(columns = {'Old Name':'New Name'})

df는 가지고있는 DataFrame이고, Old Name 은 변경할 컬럼 이름이고, New Name 은 사용자가 변경할 새 이름입니다. 이 DataFrame 내장 메서드를 사용하면 작업을 훨씬 쉽게 수행 할 수 있습니다.


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

나는 두 가지에 초점을 맞출 것이다 :

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

단일 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.renamelambda 를 사용하십시오.
이 해법에서는 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 채팅의 사람들이 저에게 지적한 것처럼 xy 사이에 * 를 추가하면 y 변수를 보호 할 수 있습니다. 이 맥락에서 나는 보호가 필요하다고 생각하지 않는다. 언급할만한 가치가 있습니다.

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

   x098  y765  z432
0     1     3     5
1     2     4     6

팬더 0.21 이상

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

  • rename 메소드axis 또는 1 로 설정할 수있는 axis 매개 변수를 추가했습니다. 이 업데이트는이 방법을 나머지 팬더 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)

두 가지 모두 다음과 같이 나타납니다.

   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 사용하기

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

MultiIndex에서는 이러한 접근 방식이 작동하지 않습니다. 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

나는이 질문과 대답이 씹어 죽었다는 것을 안다. 그러나 내가 가지고 있었던 문제 중 하나에 대한 영감을 얻기 위해 그것을 언급했습니다. 나는 다른 답변의 비트와 조각을 사용하여 그것을 해결할 수 있었고 그러므로 누군가가 그것을 필요로 할 때를 대비하여 응답을 제공 할 수있었습니다.

내 방법은 구분 기호를 구분 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

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

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

데이터 프레임이 있다면 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)')

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

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

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

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

대신 다음과 같은 목록 이해를 사용하여 한 문장으로 깔끔하게 처리 할 수 ​​있습니다.

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

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


이 시도. 그것은 나를 위해 일한다.

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

진짜 단순한 그냥 사용

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

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


행 이름 df.columns = ['a', 'b',index=False] 원하지 않는 경우 df.columns = ['a', 'b',index=False]


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)


데이터 프레임 열 이름 바꾸기 및 형식 바꾸기

import pandas as pd

data = {'year':[2015,2011,2007,2003,1999,1996,1992,1987,1983,1979,1975],
        'team':['Australia','India','Australia','Australia','Australia','Sri Lanka','Pakistan','Australia','India','West Indies','West Indies'],
        }
df = pd.DataFrame(data)

#Rename Columns
df.rename(columns={'year':'Years of Win','team':'Winning Team'}, inplace=True)

#Replace format
df = df.columns.str.replace(' ', '_')

Renaming columns while reading the Dataframe: 

>>> df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1]}).rename(columns = 
         {'$a' : 'a','$b':'b','$c':'c'})

Out[1]: 
   a  b  c
0  1  1  1

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]

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

귀하가 제공 한 이름으로 기존 이름을 대체합니다.


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







rename