Bagaimana cara menghapus spasi dari header Pandas DataFrame?

96

Saya mem-parsing data dari file Excel yang memiliki ruang putih ekstra di beberapa judul kolom.

Ketika saya memeriksa kolom dari kerangka data yang dihasilkan, dengan df.columns, saya melihat:

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

Akibatnya, saya tidak dapat melakukan:

df["Month"]

Karena itu akan memberitahu saya kolom tidak ditemukan, seperti yang saya minta untuk "Bulan", bukan "Bulan".

Pertanyaan saya, kemudian, adalah bagaimana cara menghapus spasi kosong yang tidak diinginkan dari judul kolom?

Spike Williams
sumber

Jawaban:

142

Anda dapat memberikan fungsi pada renamemetode tersebut. The str.strip()Metode harus melakukan apa yang Anda inginkan.

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]

Catatan : ini mengembalikan DataFrameobjek dan ditampilkan sebagai output di layar, tetapi perubahan tidak benar-benar disetel di kolom Anda. Untuk membuat perubahan terjadi, gunakan:

  1. Gunakan inplace=Trueargumen [dokumen]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. Tetapkan kembali ke dfvariabel Anda :
df = df.rename(columns=lambda x: x.strip())
TomAugspurger
sumber
64

Anda sekarang dapat memanggil .str.stripkolom jika Anda menggunakan versi terbaru:

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']

Pengaturan waktu

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

Jadi str.strip~ 2X lebih cepat, saya berharap skalanya lebih baik untuk df yang lebih besar

EdChum
sumber
9

Jika Anda menggunakan format CSV untuk mengekspor dari Excel dan membaca sebagai Pandas DataFrame, Anda dapat menentukan:

skipinitialspace=True

saat menelepon pd.read_csv.

Dari dokumentasi :

skipinitialspace: bool, default False

Skip spaces after delimiter.
Eric Duminil
sumber