Bagaimana cara menyingkirkan kolom "Unnamed: 0" di panda DataFrame?


152

Saya memiliki situasi di mana kadang-kadang ketika saya membaca csvdari dfsaya mendapatkan kolom seperti indeks yang tidak diinginkan bernama unnamed:0.

file.csv

,A,B,C
0,1,2,3
1,4,5,6
2,7,8,9

CSV dibaca dengan ini:

pd.read_csv('file.csv')

   Unnamed: 0  A  B  C
0           0  1  2  3
1           1  4  5  6
2           2  7  8  9

Ini sangat menyebalkan! Adakah yang punya ide tentang cara menghilangkan ini?

Jawaban:


186

Ini kolom indeks, lulus index=Falseuntuk tidak menuliskannya, lihat dokumen

Contoh:

In [37]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
pd.read_csv(io.StringIO(df.to_csv()))

Out[37]:
   Unnamed: 0         a         b         c
0           0  0.109066 -1.112704 -0.545209
1           1  0.447114  1.525341  0.317252
2           2  0.507495  0.137863  0.886283
3           3  1.452867  1.888363  1.168101
4           4  0.901371 -0.704805  0.088335

dibandingkan dengan:

In [38]:
pd.read_csv(io.StringIO(df.to_csv(index=False)))

Out[38]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

Anda juga bisa memberi tahu secara opsional read_csvbahwa kolom pertama adalah kolom indeks dengan melewatkan index_col=0:

In [40]:
pd.read_csv(io.StringIO(df.to_csv()), index_col=0)

Out[40]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

Seringkali dataset yang Anda dapatkan dari tempat lain sudah berisi kolom ini sehingga tidak benar-benar membantu mengetahui cara menghasilkan dataset "benar" menggunakan parameter yang tepat. Apakah ada cara untuk menghilangkan kolom ini ketika Anda memuatnya ketika sudah ada di sana?
Calvin Ku

2
@CalvinKu sayangnya tidak ada skipcolsarg untuk read_csv, setelah membaca di csv yang bisa Anda lakukan df = df.drop(columns=df.columns[0])atau Anda bisa membaca kolom di pertama dan kemudian melewati cols minus kolom pertama seperti cols = pd.read_csv( ....., nrows=1).columnsdan kemudian membaca kembali df = pd.read_csv(....., usecols=cols[1:])ini menghindari overhead membaca kolom berlebihan dan kemudian menjatuhkannya
EdChum

43

Masalah ini kemungkinan besar bermanifestasi karena CSV Anda disimpan bersama dengan RangeIndex(yang biasanya tidak memiliki nama). Perbaikan sebenarnya perlu dilakukan saat menyimpan DataFrame, tetapi ini tidak selalu merupakan opsi.

Menghindari Masalah: read_csvdengan index_col argumen

IMO, solusi paling sederhana adalah dengan membaca kolom yang tidak disebutkan namanya sebagai indeks . Tentukan index_col=[0]argumen untuk pd.read_csv, ini dibaca di kolom pertama sebagai indeks.

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

# Save DataFrame to CSV.
df.to_csv('file.csv')

pd.read_csv('file.csv')

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

# Now try this again, with the extra argument.
pd.read_csv('file.csv', index_col=[0])

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

Catatan
Anda bisa menghindari ini sejak awal dengan menggunakan index=Falsesaat membuat CSV output, jika DataFrame Anda tidak memiliki indeks untuk memulai.

df.to_csv('file.csv', index=False)

Tapi seperti yang disebutkan di atas, ini tidak selalu menjadi pilihan.


Solusi Stopgap: Memfilter dengan str.match

Jika Anda tidak dapat mengubah kode untuk membaca / menulis file CSV, Anda bisa menghapus kolom dengan memfilter dengan str.match:

df 

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

df.columns
# Index(['Unnamed: 0', 'a', 'b', 'c'], dtype='object')

df.columns.str.match('Unnamed')
# array([ True, False, False, False])

df.loc[:, ~df.columns.str.match('Unnamed')]

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

1
Terima kasih banyak! Yang index_col=[0]memperbaiki dengan mudah memecahkan masalah ini mengganggu 'yang tidak disebutkan namanya: 0' dan suku cadang kode dari verbose menciptakan kembali roda.
user48115

1
Untuk mendapatkan kolom yang tidak disebutkan namanya, Anda juga dapat menggunakan regex sepertidf.drop(df.filter(regex="Unname"),axis=1, inplace=True)
Sarah

8

Kasus lain yang mungkin terjadi adalah jika data Anda tidak ditulis dengan benar csvagar setiap baris diakhiri dengan koma. Ini akan meninggalkan Anda dengan kolom yang tidak disebutkan namanya Unnamed: xdi akhir data Anda ketika Anda mencoba membacanya menjadi a df.


2
Saya biasa usecols=range(0,10)memotong kolom yang tidak disebutkan namanya
Nash

8

Untuk mendapatkan semua kolom Tanpa Nama, Anda juga dapat menggunakan regex seperti df.drop(df.filter(regex="Unname"),axis=1, inplace=True)


2

Hapus saja kolom itu menggunakan: del df['column_name']

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.