เปลี่ยนชื่อ Pandas DataFrame Index


151

ฉันมีไฟล์ csv ที่ไม่มีส่วนหัวพร้อมดัชนี DateTime ฉันต้องการเปลี่ยนชื่อดัชนีและชื่อคอลัมน์ แต่ด้วย 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
สำหรับผู้ที่พบคำถามนี้ในปี 2560 โปรดตรวจสอบคำตอบด้านล่างนี้เพื่อดูคำอธิบายโดยละเอียดเกี่ยวกับ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

คำตอบ:


253

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

4
คำตอบที่ดี เพียงย้ำว่าไม่มี"inplace =True", df1.renameจะไม่เปลี่ยนแปลงอะไรจริงๆ
Sarah

70

คำตอบที่เลือกในปัจจุบันไม่ได้กล่าวถึงrename_axisวิธีการที่สามารถใช้เพื่อเปลี่ยนชื่อดัชนีและระดับคอลัมน์


นุ่นมีนิสัยแปลก ๆ เมื่อต้องเปลี่ยนชื่อระดับของดัชนี นอกจากนี้ยังมีเมธอด DataFrame ใหม่rename_axisเพื่อเปลี่ยนชื่อระดับดัชนี

มาดู 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 นี้มีหนึ่งระดับสำหรับดัชนีแถวและคอลัมน์แต่ละรายการ ทั้งดัชนีแถวและคอลัมน์ไม่มีชื่อ เปลี่ยนชื่อระดับดัชนีแถวเป็น 'ชื่อ'

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_axisในลักษณะเดียวกับที่เราทำกับ DataFrames

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

Nameขอให้สังเกตว่ามีชิ้นพิเศษของเมตาดาต้าดังต่อไปนี้เรียกว่าซีรีส์ เมื่อสร้างซีรี่ส์จาก DataFrame แอตทริบิวต์นี้จะถูกตั้งค่าเป็นชื่อคอลัมน์

เราสามารถส่งชื่อสตริงไปยังrenameเมธอดเพื่อเปลี่ยนได้

s.rename('FOOOOOD')

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

DataFrames ไม่มีแอตทริบิวต์นี้และ infact จะเพิ่มข้อยกเว้นหากใช้เช่นนี้

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" นั่นคือสิ่งที่ฉันกำลังมองหาเมื่อใช้ "เปลี่ยนชื่อดัชนีแพนด้า" และลงเอยที่นี่ แก้ไข: เดี๋ยวก่อนคำตอบที่ยอมรับอธิบายได้ในตอนแรกมันไม่ชัดเจนสำหรับฉัน
Ben Farmer

ดีนี่เป็นคำตอบเดียวที่สามารถใช้ในการมอบหมายงานที่ถูกล่ามโซ่ได้!
IanS

20

สำหรับpandasเวอร์ชันที่ใหม่กว่า

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

หรือ

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

จำเป็นต้องใช้อย่างหลังหาก data frame ควรคงคุณสมบัติทั้งหมดไว้


18

ใน Pandas เวอร์ชัน 0.13 ขึ้นไปชื่อระดับดัชนีจะไม่เปลี่ยนรูป (ประเภทFrozenList) และไม่สามารถตั้งค่าได้โดยตรงอีกต่อไป ก่อนอื่นคุณต้องใช้Index.rename()เพื่อใช้ชื่อระดับดัชนีใหม่กับดัชนีจากนั้นใช้DataFrame.reindex()เพื่อใช้ดัชนีใหม่กับ DataFrame ตัวอย่าง:

สำหรับ Pandas เวอร์ชั่น <0.13

df.index.names = ['Date']

สำหรับเวอร์ชั่น Pandas> = 0.13

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

9
ไม่จริง! ในเวอร์ชันของฉัน Pandas (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])มันเป็นไปได้ที่จะเปลี่ยนชื่อNoneไป measures?
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)

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

เป็นคนเดียวที่ทำงานให้ฉัน (แพนด้า 0.22.0)
หากไม่มี inplace = True ชื่อของดัชนีจะไม่ถูกตั้งค่าในกรณีของฉัน


2

สำหรับดัชนีเดี่ยว:

 df.index.rename('new_name')

สำหรับ Multi Index:

 df.index.rename(['new_name','new_name2'])

นอกจากนี้เรายังสามารถใช้สิ่งนี้ในแพนด้าล่าสุด:

rename_axis


หากคุณทำเช่นนั้นคุณจะมีดัชนีที่เปลี่ยนชื่อเป็นผลตอบแทน แต่กรอบข้อมูลจะไม่เปลี่ยนแปลง
Jean Paul

1

คุณสามารถใช้indexและคุณลักษณะของcolumns 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.