Pandas DataFrame 색인 이름 바꾸기


142

DateTime 인덱스가있는 헤더가없는 CSV 파일이 있습니다. 색인과 열 이름을 바꾸고 싶지만 df.rename ()을 사용하면 열 이름 만 바뀝니다. 곤충? 0.12.0 버전입니다

In [2]: df = pd.read_csv(r'D:\Data\DataTimeSeries_csv//seriesSM.csv', header=None, parse_dates=[[0]], index_col=[0] )

In [3]: df.head()
Out[3]: 
                   1
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

In [4]: df.rename(index={0:'Date'}, columns={1:'SM'}, inplace=True)

In [5]: df.head()
Out[5]: 
                  SM
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

5
2017 년 에이 질문에 오는 사람들 은 아래 답변 을 확인하여 rename_axis방법에 대한 자세한 설명을 확인하십시오 .
Ted Petrou

3
그리고 아래 전체 좋은 답변을 읽는 성가 시게 할 수없는 사람들을 위해, 다음 빠른 해결책은 df.rename_axis("Date", axis='index', inplace=True)설명서에 따라 pandas.pydata.org/pandas-docs/stable/generated/... 또는df.index.names = ['Date']
tommy.carstensen

답변:


237

rename방법은 색인 값에 적용되는 색인 사전을 사용 합니다 .
색인 레벨의 이름으로 바꾸려고합니다.

df.index.names = ['Date']

이것을 생각하는 좋은 방법은 열과 색인이 동일한 유형의 객체 ( Index또는 MultiIndex)이며, 전치를 통해 둘을 상호 교환 할 수 있다는 것입니다.

인덱스 이름이 열과 비슷한 의미를 갖기 때문에 약간 혼란 스러우므로 여기에 몇 가지 예가 더 있습니다.

In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))

In [2]: df
Out[2]: 
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df1 = df.set_index('A')

In [4]: df1
Out[4]: 
   B  C
A      
1  2  3
4  5  6

색인에서 이름 바꾸기를 볼 수 있으며 1을 변경할 수 있습니다 .

In [5]: df1.rename(index={1: 'a'})
Out[5]: 
   B  C
A      
a  2  3
4  5  6

In [6]: df1.rename(columns={'B': 'BB'})
Out[6]: 
   BB  C
A       
1   2  3
4   5  6

레벨 이름을 바꾸는 동안 :

In [7]: df1.index.names = ['index']
        df1.columns.names = ['column']

참고 :이 속성은 목록 일 뿐이므로 목록 이해 /지도로 이름을 바꿀 수 있습니다.

In [8]: df1
Out[8]: 
column  B  C
index       
1       2  3
4       5  6

2
좋은 대답입니다. 없는 것을 그냥 부드러운 알림 "inplace =True", df1.rename정말 아무것도 변하지 않을 것입니다.
Sarah

63

현재 선택된 답변에는 rename_axis색인 및 열 수준의 이름을 바꾸는 데 사용할 수있는 방법이 언급되어 있지 않습니다 .


팬더는 지수의 이름을 바꾸는 데 약간의 문제가 있습니다. rename_axis색인 레벨 이름을 변경하는 데 사용할 수 있는 새로운 DataFrame 메소드도 있습니다.

DataFrame을 살펴 봅시다

df = pd.DataFrame({'age':[30, 2, 12],
                       'color':['blue', 'green', 'red'],
                       'food':['Steak', 'Lamb', 'Mango'],
                       'height':[165, 70, 120],
                       'score':[4.6, 8.3, 9.0],
                       'state':['NY', 'TX', 'FL']},
                       index = ['Jane', 'Nick', 'Aaron'])

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

이 DataFrame에는 각 행 및 열 인덱스마다 하나의 수준이 있습니다. 행 및 열 색인 모두 이름이 없습니다. 행 인덱스 레벨 이름을 'names'로 변경하십시오.

df.rename_axis('names')

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

rename_axis메소드에는 axis매개 변수 를 변경하여 열 레벨 이름을 변경하는 기능도 있습니다.

df.rename_axis('names').rename_axis('attributes', axis='columns')

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

일부 열을 사용하여 색인을 설정하면 열 이름이 새 색인 레벨 이름이됩니다. 원래의 DataFrame에 인덱스 레벨을 추가합시다 :

df1 = df.set_index(['state', 'color'], append=True)
df1

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

원래 색인의 이름이 없는지 확인하십시오. 우리는 여전히 사용할 수 rename_axis있지만 색인 레벨 수와 동일한 길이의 목록을 전달해야합니다.

df1.rename_axis(['names', None, 'Colors'])

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

None인덱스 레벨 이름을 효과적으로 삭제하는 데 사용할 수 있습니다 .


시리즈는 비슷하지만 약간의 차이가 있습니다.

세 가지 색인 수준으로 시리즈를 만들어 봅시다

s = df.set_index(['state', 'color'], append=True)['food']
s

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: food, dtype: object

rename_axisDataFrame을 사용한 방식과 유사하게 사용할 수 있습니다.

s.rename_axis(['Names','States','Colors'])

Names  States  Colors
Jane   NY      blue      Steak
Nick   TX      green      Lamb
Aaron  FL      red       Mango
Name: food, dtype: object

Series 아래에라는 추가 메타 데이터가 있습니다 Name. DataFrame에서 Series를 만들 때이 특성은 열 이름으로 설정됩니다.

rename메소드에 문자열 이름을 전달 하여 변경할 수 있습니다

s.rename('FOOOOOD')

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: FOOOOOD, dtype: object

DataFrames에는이 속성이 없으며 실제로 이와 같이 사용하면 예외가 발생합니다.

df.rename('my dataframe')
TypeError: 'str' object is not callable

팬더 0.21 이전 rename_axis에는 인덱스 및 열의 값 이름을 바꾸는 데 사용할 수있었습니다 . 더 이상 사용되지 않으므로이 작업을 수행하지 마십시오


1
df1 = df.set_index(['state', 'color'], append=True)와 교환해야합니까 df1.rename_axis(['names', None, 'Colors'])?
salhin

"Nick"의 이름을 "Nicolas"로 바꾸려면 어떻게합니까? 내가 "팬더 색인 이름 바꾸기"를봤을 때 내가 찾던 것이 었습니다. 편집 : 아 잠깐, 받아 들인 대답은 설명 할뿐입니다. 처음에는 나에게 분명하지 않았습니다.
벤 파머

좋아, 이것은 체인 할당에서 사용할 수있는 유일한 대답입니다!
IanS

19

최신 pandas버전

df.index = df.index.rename('new name')

또는

df.index.rename('new name', inplace=True)

데이터 프레임이 모든 속성을 유지해야하는 경우 후자가 필요 합니다.


18

Pandas 버전 0.13 이상에서 색인 레벨 이름은 변경할 FrozenList수 없으며 (type ) 더 이상 직접 설정할 수 없습니다. 먼저 Index.rename()새 인덱스 레벨 이름을 인덱스 DataFrame.reindex()에 적용한 다음 새 인덱스를 DataFrame에 적용하는 데 사용해야합니다. 예 :

팬더 버전 <0.13

df.index.names = ['Date']

팬더 버전> = 0.13

df = df.reindex(df.index.rename(['Date']))

9
사실이 아니다! 내 판다 버전 (0.13.1)에서 df.index.names = [ 'foo'] 제대로 작동합니다!
LondonRob

5
@LondonRob-`df.index.names = [ 'foo']`도 Pandas 0.14에서 작동한다는 점에 주목 해 주셔서 감사합니다. 분명히 그것은 간단히 깨졌고 그것을 테스트 할 때 포함되었습니다.
David Smith

1
둘 중 하나 index또는 column직접 이름을 설정하면 이 방법이 아닌 나를 위해 변경됩니다 (Pandas 0.19).
FooBar

8

Index.set_names다음과 같이 사용할 수도 있습니다 .

In [25]: x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
   ....:                   'country':['A','A','B','B','A','A','B','B'],
   ....:                   'prod':[1,2,1,2,1,2,1,2],
   ....:                   'val':[10,20,15,25,20,30,25,35]})

In [26]: x = x.set_index(['year','country','prod']).squeeze()

In [27]: x
Out[27]: 
year  country  prod
1     A        1       10
               2       20
      B        1       15
               2       25
2     A        1       20
               2       30
      B        1       25
               2       35
Name: val, dtype: int64
In [28]: x.index = x.index.set_names('foo', level=1)

In [29]: x
Out[29]: 
year  foo  prod
1     A    1       10
           2       20
      B    1       15
           2       25
2     A    1       20
           2       30
      B    1       25
           2       35
Name: val, dtype: int64

2
이 일을 할 수 있습니까 multiIndex? MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F'], ['Y', 'Z']], labels=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], names=['Portfolio', None])의 이름을 바꿀 Nonemeasures있습니까?
ctrl-alt-delete

2

열과 인덱스의 이름을 바꾸는 데 동일한 매핑을 사용하려면 다음을 수행하십시오.

mapping = {0:'Date', 1:'SM'}
df.index.names = list(map(lambda name: mapping.get(name, name), df.index.names))
df.rename(columns=mapping, inplace=True)

0
df.index.rename('new name', inplace=True)

나를 위해 일하는 유일한 사람입니다 (팬더 0.22.0).
inplace = True가 없으면 색인 이름이 제 경우에 설정되지 않습니다.


0

당신이 사용할 수 indexcolumns의 속성 pandas.DataFrame. 참고 : 목록의 요소 수는 행 / 열 수와 일치해야합니다.

#       A   B   C
# ONE   11  12  13
# TWO   21  22  23
# THREE 31  32  33

df.index = [1, 2, 3]
df.columns = ['a', 'b', 'c']
print(df)

#     a   b   c
# 1  11  12  13
# 2  21  22  23
# 3  31  32  33
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.