ฉันจะตัดช่องว่างออกจากส่วนหัว Pandas DataFrame ได้อย่างไร


96

ฉันกำลังแยกวิเคราะห์ข้อมูลจากไฟล์ Excel ที่มีช่องว่างพิเศษในส่วนหัวคอลัมน์บางส่วน

เมื่อฉันตรวจสอบคอลัมน์ของดาต้าเฟรมที่เป็นผลลัพธ์df.columnsฉันจะเห็น:

Index(['Year', 'Month ', 'Value'])
                     ^
#                    Note the unwanted trailing space on 'Month '

ดังนั้นฉันไม่สามารถทำ:

df["Month"]

เพราะมันจะบอกฉันว่าไม่พบคอลัมน์ตามที่ฉันขอ "เดือน" ไม่ใช่ "เดือน"

คำถามของฉันคือฉันจะดึงพื้นที่สีขาวที่ไม่ต้องการออกจากส่วนหัวของคอลัมน์ได้อย่างไร?

คำตอบ:


142

คุณสามารถให้ฟังก์ชันแก่renameเมธอด str.strip()วิธีการควรจะทำสิ่งที่คุณต้องการ

In [5]: df
Out[5]: 
   Year  Month   Value
0     1       2      3

[1 rows x 3 columns]

In [6]: df.rename(columns=lambda x: x.strip())
Out[6]: 
   Year  Month  Value
0     1      2      3

[1 rows x 3 columns]

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

  1. ใช้inplace=Trueอาร์กิวเมนต์[docs]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. กำหนดกลับไปที่dfตัวแปรของคุณ:
df = df.rename(columns=lambda x: x.strip())

64

ตอนนี้คุณสามารถโทรหา.str.stripคอลัมน์ได้หากคุณใช้เวอร์ชันล่าสุด:

In [5]:
df = pd.DataFrame(columns=['Year', 'Month ', 'Value'])
print(df.columns.tolist())
df.columns = df.columns.str.strip()
df.columns.tolist()

['Year', 'Month ', 'Value']
Out[5]:
['Year', 'Month', 'Value']

การกำหนดเวลา

In[26]:
df = pd.DataFrame(columns=[' year', ' month ', ' day', ' asdas ', ' asdas', 'as ', '  sa', ' asdas '])
df
Out[26]: 
Empty DataFrame
Columns: [ year,  month ,  day,  asdas ,  asdas, as ,   sa,  asdas ]


%timeit df.rename(columns=lambda x: x.strip())
%timeit df.columns.str.strip()
1000 loops, best of 3: 293 µs per loop
10000 loops, best of 3: 143 µs per loop

ดังนั้นstr.stripเป็น ~ 2X เร็วขึ้นผมคาดหวังนี้จะไต่ที่ดีกว่าสำหรับ DFS ขนาดใหญ่


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