โซลูชันบรรทัดเดียวหรือท่อส่ง
ฉันจะเน้นสองสิ่ง:
OP ระบุอย่างชัดเจน
  ฉันมีชื่อคอลัมน์ที่ถูกแก้ไขเก็บไว้ในรายการ แต่ฉันไม่ทราบวิธีการแทนที่ชื่อคอลัมน์  
ฉันไม่ต้องการแก้ปัญหาวิธีแทนที่'$'หรือถอดอักขระตัวแรกออกจากส่วนหัวของคอลัมน์แต่ละคอลัมน์ OP ทำขั้นตอนนี้แล้ว แต่ฉันต้องการที่จะมุ่งเน้นไปที่การแทนที่columnsวัตถุที่มีอยู่ด้วยใหม่ให้กับรายการของชื่อคอลัมน์ทดแทน
 
df.columns = newโดยที่newรายการของชื่อคอลัมน์ใหม่นั้นง่ายเท่าที่จะได้รับ ข้อเสียเปรียบของวิธีนี้คือมันต้องมีการแก้ไขcolumnsแอตทริบิวต์ของ dataframe ที่มีอยู่และไม่ได้ทำแบบอินไลน์ ฉันจะแสดงสองสามวิธีในการดำเนินการผ่าน pipelining โดยไม่ต้องแก้ไข dataframe ที่มีอยู่
 
การติดตั้ง 1
 
เพื่อเน้นที่ความจำเป็นในการเปลี่ยนชื่อของการแทนที่ชื่อคอลัมน์ด้วยรายการที่มีอยู่แล้วฉันจะสร้างตัวอย่าง dataframe ใหม่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
pd.concatใช้keysอาร์กิวเมนต์  
ก่อนอื่นให้สังเกตว่าเกิดอะไรขึ้นเมื่อเราพยายามใช้โซลูชันที่ 1:
df.rename(columns=dict(zip(df, new)))
   y765  y765  z432
0     1     3     5
1     2     4     6
เราไม่ได้แมปnewรายการเป็นชื่อคอลัมน์ y765เราจบลงด้วยซ้ำ แต่เราสามารถใช้keysอาร์กิวเมนต์ของฟังก์ชั่นในขณะที่การทำซ้ำผ่านคอลัมน์ของpd.concatdf
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 objectคอลัมน์ทั้งหมดและการแปลงกลับต้องใช้งานพจนานุกรมมากกว่านี้
เดียว 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
 
นี้เป็นเคล็ดลับที่เป็นลูกเล่นด้วยและ  transpose ช่วยให้เราสามารถตั้งค่าแบบอินไลน์ดัชนี แต่ไม่มีที่สอดคล้องกัน ดังนั้นเราสามารถเปลี่ยนจากนั้นและเปลี่ยนกลับ อย่างไรก็ตามข้อแม้เดียวเปรียบเทียบกับคำเตือนแบบผสมจากโซลูชัน 3 ใช้ที่นี่set_indexpd.DataFrame.set_indexset_columnsset_indexdtypedtype
เดียว 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
 
ใช้lambdaในpd.DataFrame.renameรอบนั้นผ่านแต่ละองค์ประกอบของnew
ในโซลูชันนี้เราส่งแลมบ์ดาที่ใช้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ถ้าฉันเพิ่ม*ในระหว่างxและyฉันสามารถป้องกันyตัวแปรของฉัน แม้ว่าในบริบทนี้ฉันไม่เชื่อว่าต้องการการปกป้อง มันยังคงเป็นมูลค่าการกล่าวขวัญ
df.rename(columns=lambda x, *, y=iter(new): next(y))
   x098  y765  z432
0     1     3     5
1     2     4     6