โซลูชันบรรทัดเดียวหรือท่อส่ง
ฉันจะเน้นสองสิ่ง:
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.concat
df
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_index
pd.DataFrame.set_index
set_columns
set_index
dtype
dtype
เดียว 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