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?

Michael Perdue
sumber

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
EdChum
sumber
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
cs95
sumber
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.

Brendan
sumber
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)

Sarah
sumber
2

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

saree
sumber