การเปลี่ยนชื่อคอลัมน์เฉพาะใน pandas DataFrame


195

DataFrameผมกำลังมองหาวิธีที่สง่างามที่จะเปลี่ยนชื่อคอลัมน์ที่ระบุใน

เล่นข้อมูล ...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

ทางออกที่ดีที่สุดที่ฉันได้พบ ...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

ฉันหวังว่าจะเป็นหนึ่งซับง่าย ... ความพยายามนี้ล้มเหลว ...

df.columns[df.columns.tolist().index('one')] = 'another_name'

คำแนะนำใด ๆ ที่ได้รับสุดซึ้ง

คำตอบ:


355

ซับหนึ่งมีอยู่:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

ต่อไปนี้เป็น docstring สำหรับrenameวิธีการ

คำนิยาม: df.rename (ตนเอง, ดัชนี = ไม่มี, คอลัมน์ = ไม่มี, คัดลอก = True, inplace = False)
Docstring:
แก้ไขดัชนีและ / หรือคอลัมน์โดยใช้ฟังก์ชันอินพุตหรือ
ฟังก์ชั่น. ค่า Function / dict ต้องไม่ซ้ำกัน (1 ต่อ 1) ป้ายกำกับไม่
ที่มีอยู่ใน dict / Series จะถูกปล่อยให้เป็น -

พารามิเตอร์
----------
ดัชนี: เหมือน dict หรือฟังก์ชั่นเป็นตัวเลือก
    การแปลงเพื่อใช้กับค่าดัชนี
คอลัมน์: เหมือน dict หรือฟังก์ชั่นเป็นตัวเลือก
    การแปลงเพื่อใช้กับค่าคอลัมน์
คัดลอก: บูลีน, ค่าเริ่มต้นเป็น True
    คัดลอกข้อมูลพื้นฐานด้วย
inplace: บูลีน, ค่าเริ่มต้นเป็นเท็จ
    จะส่งคืน DataFrame ใหม่หรือไม่ ถ้าเป็น True ค่าของการทำสำเนาคือ
    ละเว้น

ดูสิ่งนี้ด้วย
--------
Series.rename

ผลตอบแทน
-------
เปลี่ยนชื่อ: DataFrame (วัตถุใหม่)

สิ่งนี้ไม่ได้ผลสำหรับฉันถ้าฉันใช้ inplace = True ดังที่แสดงใน @ Jeong-Yoon Lee
JStrahl

109

เนื่องจากinplaceอาร์กิวเมนต์พร้อมใช้งานคุณไม่จำเป็นต้องคัดลอกและกำหนดกรอบข้อมูลดั้งเดิมกลับไปที่ตัวเอง แต่ทำดังนี้:

df.rename(columns={'two':'new_name'}, inplace=True)

39

เกี่ยวกับอะไร

df.columns.values[2] = "new_name"

11
จริง ๆ แล้วมันไม่ทำงานถ้าในภายหลังคุณใช้ชื่อคอลัมน์ในการดำเนินการอื่น ๆ เช่นใน df ['new_name']
มาสเตอร์โยเกิร์ต

4
คำตอบนี้มีประโยชน์สำหรับฉันในการเปลี่ยนคอลัมน์เฉพาะเป็นชื่อใหม่ คอลัมน์ที่ 1 คือดัชนี 0, คอลัมน์ที่ 2 คือดัชนี 1 และอื่น ๆ โซลูชันที่ดี .. และฉันมั่นใจว่าจะช่วยให้ผู้คนมากขึ้น .. เนื่องจากโซลูชันอื่น ๆ ต้องการให้คุณรู้และคัดลอกชื่อคอลัมน์เดิมไว้ล่วงหน้า .... ในขณะที่นี่เป็นวิธีที่รวดเร็วและสกปรก .. ซึ่งมีการใช้งานของตัวเอง
ihightower

1
@MasterYogurt ความคิดเห็นของคุณไม่ถูกต้อง เป็นไปได้ที่จะดำเนินการdf['new_name'](และสิ่งอื่น ๆ ของแพนด้า) หลังจากเปลี่ยนตัวแปรตามที่อธิบายไว้ข้างต้น ความคิดเห็นของคุณอาจใช้ได้เมื่อมีการโพสต์ครั้งแรก
344352 Jacob H ชั่วโมง

1
ที่ถูกกล่าวว่าการใช้renameวิธีการเป็นทางออกที่ดีกว่า
344351 Jacob H ชั่วโมง

6

ตอนนี้ Pandas 0.21 มีพารามิเตอร์แกน

วิธีการเปลี่ยนชื่อได้รับพารามิเตอร์แกนเพื่อให้ตรงกับส่วนที่เหลือของ pandas API

ดังนั้นนอกเหนือจากนี้:

df.rename(columns = {'two':'new_name'})

คุณทำได้:

df.rename({'two':'new_name'}, axis=1)

หรือ

df.rename({'two':'new_name'}, axis='columns')

df.rename ({'two': 'new_name'}, axis = 'columns') พ่น TypeError: ไม่สามารถระบุทั้ง 'axis' และ 'index' หรือ 'column' ใด ๆ
นี่คือ

@ ที่นี่ที่นี่ให้แน่ใจว่าคุณอยู่ในรุ่นนุ่น 0.21 ทำการpd.__version__ตรวจสอบเวอร์ชั่นของคุณ
Ted Petrou

5

หากคุณรู้ว่าคอลัมน์ # คืออะไร (ครั้งแรก / วินาที / เดือนที่ n) โซลูชันนี้โพสต์ในคำถามที่คล้ายกันจะทำงานโดยไม่คำนึงถึงชื่อหรือไม่ตั้งชื่อและในหนึ่งบรรทัด: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)

3

สำหรับการเปลี่ยนชื่อคอลัมน์ที่นี่เป็นสิ่งที่ง่ายซึ่งจะใช้ได้ทั้งDefault(0,1,2,etc;)กับคอลัมน์ที่มีอยู่แล้ว แต่ไม่ค่อยมีประโยชน์สำหรับชุดข้อมูลขนาดใหญ่ (มีหลายคอลัมน์)

สำหรับชุดข้อมูลขนาดใหญ่เราสามารถแบ่งคอลัมน์ที่เราต้องการและใช้โค้ดด้านล่าง:

df.columns = ['new_name','new_name1','old_name']

2

การติดตามรหัสย่อสามารถช่วยได้:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

ลบช่องว่างออกจากคอลัมน์


ฉันได้รับAttributeError: 'int' object has no attribute 'replace'คุณสามารถขยายในที่
Nirmal

2

นุ่นรุ่น 0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

สำหรับบันทึก:

การละเว้น index = str จะให้การแทนที่ข้อผิดพลาดมีอาร์กิวเมนต์ที่ไม่คาดคิด 'คอลัมน์'


1

ตัวเลือกอื่นจะเป็นการคัดลอกและวางคอลัมน์:

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

หลังจากนั้นคุณจะได้รับผล:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5

2
วิธีนี้จะไม่ช่วยในกรณีที่ลำดับของดัชนีคอลัมน์มีความสำคัญ คอลัมน์ใหม่จะถูกสร้างขึ้นในตอนท้าย
Loochie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.