จะเพิ่มคำต่อท้าย (หรือคำนำหน้า) ให้กับชื่อคอลัมน์แต่ละคอลัมน์ได้อย่างไร?


89

ฉันต้องการเพิ่ม_xคำต่อท้ายให้กับชื่อคอลัมน์แต่ละคอลัมน์ดังนี้:

featuresA = myPandasDataFrame.columns.values + '_x'

ฉันต้องทำอย่างไร นอกจากนี้หากฉันต้องการเพิ่มx_เป็นคำต่อท้ายวิธีแก้ไขจะเปลี่ยนไปอย่างไร

คำตอบ:


124

คุณสามารถใช้ความlistเข้าใจ:

df.columns = [str(col) + '_x' for col in df.columns]

นอกจากนี้ยังมีวิธีการในตัวเช่น.add_suffix()และ.add_prefix()ตามที่กล่าวไว้ในคำตอบอื่น


นี่คือคำตอบที่เรียบง่ายและสง่างามที่สุด!
Jinhua Wang

165

ต่อไปนี้เป็นวิธีที่ดีที่สุดในการเพิ่มคำต่อท้ายในความคิดของฉัน

df = df.add_suffix('_some_suffix')

เนื่องจากเป็นฟังก์ชันที่เรียกใช้บน DataFrame และส่งคืน DataFrame คุณจึงสามารถใช้งานได้ในสายการโทร


14
คุณสามารถใช้ add_prefix หากคุณต้องการเพิ่มคำนำหน้าให้กับชื่อ
Jorge

9
น่าเสียดายที่ไม่สามารถเปลี่ยนแปลงได้ (เช่นไม่มีinplace=Trueตัวเลือกพารามิเตอร์) มิฉะนั้นสมบูรณ์แบบ
ijoseph

ฉันคิดว่านี่ดีกว่าคำตอบที่ได้รับการยอมรับในบางสถานการณ์เนื่องจากสามารถใช้ในการดำเนินการเป็นลูกโซ่ในคำสั่งเดียวแทนที่จะต้องการคำสั่งของตัวเอง
Captain Lepton

@CaptainLepton เมื่อคำตอบนี้ไม่ดีไปกว่าคำตอบที่ยอมรับ
baxx

1
ถ้าคำต่อท้ายไม่ใช่ค่าคงที่ ชื่อเรื่องพูดถึงคำต่อท้าย โพสต์จะ จำกัด ขอบเขตให้แคบลงเหลือเพียงคำต่อท้ายค่าคงที่เดียว แต่ถ้าเราตอบชื่อโพสต์ในแง่ทั่วไปการตั้งค่าคอลัมน์ผ่านการเข้าใจรายการหรือการทำซ้ำแบบอื่นจะมีความยืดหยุ่นมากกว่า
กัปตัน Lepton

18

การเชื่อมต่อในสถานที่ที่หรูหรา

หากคุณกำลังพยายามแก้ไขdfในสถานที่ตัวเลือกที่ถูกที่สุด (และง่ายที่สุด) จะอยู่ในตำแหน่งเพิ่มเติมโดยตรงdf.columns(กล่าวคือใช้Index.__iadd__)

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

ในการเพิ่มคำนำหน้าคุณจะใช้ในทำนองเดียวกัน

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

อีกทางเลือกหนึ่งที่ถูกคือการใช้การทำความเข้าใจรายการด้วยf-stringการจัดรูปแบบ (มีใน python3.6 +)

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

และสำหรับคำนำหน้าในทำนองเดียวกัน

df.columns = [f'some_prefix{c}' for c in df]

วิธีการเชื่อมโยง

นอกจากนี้ยังเป็นไปได้ที่จะทำการแก้ไข add * ในขณะที่ผูกมัดวิธี หากต้องการเพิ่มคำต่อท้ายให้ใช้DataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

สิ่งนี้ส่งคืนสำเนาของข้อมูล IOW dfไม่มีการแก้ไข

DataFrame.add_prefixเพิ่มคำนำหน้าจะทำยังกับ

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

dfซึ่งยังไม่ได้ปรับเปลี่ยน


คำติชมของ add_*fix

นี่เป็นวิธีการที่ดีหากคุณกำลังพยายามผูกมัดวิธีการ:

df.some_method1().some_method2().add_*fix(...)

อย่างไรก็ตามadd_prefix(และadd_suffix) สร้างสำเนาของกรอบข้อมูลทั้งหมดเพียงเพื่อแก้ไขส่วนหัว หากคุณเชื่อว่าเป็นการสิ้นเปลือง แต่ยังคงต้องการเชื่อมโยงคุณสามารถโทรpipe:

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)

สวยหรูขนาดนี้! จะเกิดอะไรขึ้นถ้าคุณต้องการเพิ่มคำนำหน้าหรือคำต่อท้ายให้กับส่วนย่อยของคอลัมน์เช่นคอลัมน์ที่ชื่อทั้งหมดมีคำทั่วไป (เช่นnewหรือold) แทนทุกคอลัมน์? ขอบคุณ.
Bowen Liu

1
@BowenLiu ฉันขอแนะนำให้ไปกับ df.rename () แทน ... ส่งชื่อการแมปพจนานุกรมไปยังชื่อใหม่ของพวกเขา จากนั้นเรียกเปลี่ยนชื่อด้วยแกน = 1 คุณยังสามารถใช้การกำหนดความเข้าใจรายการตามเงื่อนไข
cs95

ใช้งานได้เฉพาะกับชนิดข้อมูลทั่วไปเป็นชื่อคอลัมน์ไม่ใช่ถ้าคอลัมน์ของคุณเป็น RangeIndex เช่นdf = pd.DataFrame([[1,2,3]]*10)-> df.columnsคุณจะใช้df.add_suffix('_x')
questionto42

คุณสามารถทำได้df.columns = df.columns.astype(str) + '_x' ตามวิธีแรกของฉัน
cs95

4

ฉันไม่เห็นโซลูชันนี้ที่เสนอข้างต้นดังนั้นจึงเพิ่มสิ่งนี้ลงในรายการ:

df.columns += '_x'

และคุณสามารถปรับให้เข้ากับสถานการณ์คำนำหน้าได้อย่างง่ายดาย


ทางออกที่ดีที่สุดสำหรับคำต่อท้ายแม้ว่าจะไม่สามารถใช้คำนำหน้าได้แน่นอน
questionto42

ใช้งานได้เฉพาะกับชนิดข้อมูลปกติในชื่อคอลัมน์ไม่ใช่ถ้าคอลัมน์ของคุณเป็น RangeIndex เช่นdf = pd.DataFrame([[1,2,3]]*10)-> df.columnsคุณจะใช้df.add_suffix('_x')
questionto42

1

ฉันรู้ 4 วิธีในการเพิ่มคำต่อท้าย (หรือคำนำหน้า) ให้กับชื่อคอลัมน์ของคุณ:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

หรือ

2- df.rename(columns= lambda col: col+'_some_suffix')

หรือ

3- df.columns += '_some_suffix'มาก

หรือที่อร่อยที่สุด:

3- df.add_suffix('_some_suffix')


0

การใช้DataFrame.rename.

การเลิกใช้งานadd_prefixและadd_suffix

ในรุ่นอนาคตของหมีแพนด้าadd_prefixและadd_suffixจะเลิก วิธีใหม่ที่แนะนำคือการใช้DataFrame.rename:

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

การใช้renameกับaxis=1และการจัดรูปแบบสตริง:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

ในการเขียนทับชื่อคอลัมน์ของคุณจริงๆเราสามารถกำหนดค่าที่ส่งคืนให้กับdf:

df = df.rename('col_{}'.format, axis=1)

หรือใช้inplace=True:

df.rename('col_{}'.format, axis=1, inplace=True)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.