Pandaların DataFrame'inde “Adsız: 0” sütunundan nasıl kurtulurum?


167

Ben okumak burada bazen bir durum var csvdan dfI istenmeyen bir indeks benzeri adlı sütunun olsun unnamed:0.

file.csv

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

CSV şununla okunur:

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

Bu çok can sıkıcı! Bundan nasıl kurtulacağına dair bir fikri olan var mı?

Yanıtlar:


205

Bu indeks sütunudur, yazmamak index=Falseiçin geçin, belgelere bakın

Misal:

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

ile karşılaştırmak:

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

Ayrıca isteğe bağlı olarak read_csv, ilk sütunun dizin sütunu olduğunu şunu ileterek de anlayabilirsiniz 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

1
Çoğu zaman başka bir yerden aldığınız veri kümeleri zaten bu sütunu içerir, bu nedenle doğru parametreleri kullanarak "doğru" veri kümesini nasıl üreteceğinizi bilmenize gerçekten yardımcı olmaz. Zaten oradayken yüklediğinizde bu sütunu ortadan kaldırmanın bir yolu var mı?
Calvin Ku

2
@CalvinKu maalesef yoktur skipcolsiçin arg read_csvsadece yapabileceği csv okuduktan sonra, df = df.drop(columns=df.columns[0])ya da sadece ilk sütun okumak ve ardından cols eksi gibi ilk sütun şey geçebileceği cols = pd.read_csv( ....., nrows=1).columnstekrar tekrar okunur ve daha sonra df = pd.read_csv(....., usecols=cols[1:])bu okuma yükünden kaçınmak gereksiz bir sütun ve ardından onu düşürmek
EdChum

53

Bu sorun büyük olasılıkla CSV'nizin RangeIndex(genellikle bir adı olmayan) kaydedilmiş olmasından kaynaklanmaktadır . DataFrame'i kaydederken düzeltmenin aslında yapılması gerekir, ancak bu her zaman bir seçenek değildir.

Sorun kaçınmak: read_csvile index_col argüman

IMO, en basit çözüm adsız sütunu indeks olarak okumak olacaktır . Bir index_col=[0]argüman belirtin pd.read_csv, bu ilk sütunda dizin olarak okur.

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

Not DataFrame'inizin başlayacak bir dizini yoksa, CSV çıktısını oluştururken
kullanarak ilk etapta index=Falsebundan kaçınabilirsiniz.

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

Ancak yukarıda belirtildiği gibi, bu her zaman bir seçenek değildir.


Stopgap Solution: ile filtreleme str.match

CSV dosyasını okumak / yazmak için kodu değiştiremez, sadece olabilir filtreleyerek sütunu kaldırmak ile 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
Çok teşekkürler! Bu index_col=[0]düzeltme, bu can sıkıcı 'adsız: 0' sorununu kolayca çözdü ve kodu ayrıntılı tekerleği yeniden icat etmekten kurtarıyor.
user48115

1
Adsız sütunlardan yararlanmak için, şu normal ifadeleri de kullanabilirsinizdf.drop(df.filter(regex="Unname"),axis=1, inplace=True)
Sarah

9

Tüm Adsız sütunlarda gezinmek için aşağıdaki normal ifadeleri de kullanabilirsiniz. df.drop(df.filter(regex="Unname"),axis=1, inplace=True)


8

Bunun olabileceği başka bir durum da, verilerinizin csvher satırın virgülle bitmesi için yanlış bir şekilde yazılmasıdır . Bu, Unnamed: xverilerinizi bir .pdf olarak okumaya çalıştığınızda, verilerinizin sonunda adsız bir sütun bırakacaktır df.


2
Kullandığım usecols=range(0,10)isimsiz sütun kesmeye
Nash


1

Adsız Sütunlar ile aşağıdakileri yapabilirsiniz:

  1. Adsız sütunları sil
  2. Onları yeniden adlandırın (kullanmak istiyorsanız)

file.csv

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

#read dosya df = pd.read_csv('file.csv')

Yöntem 1: Adsız Sütunları Sil

# delete one by one like column is 'Unnamed: 0' so use it's name
df.drop('Unnamed: 0', axis=1, inplace=True)

#delete all Unnamed Columns in a single code of line using regex
df.drop(df.filter(regex="Unnamed"),axis=1, inplace=True)

Yöntem 2: Adsız Sütunları Yeniden Adlandırma

df.rename(columns = {'Unnamed: 0':'Name'}, inplace = True)

Girdi dosyasında olduğu gibi boş bir başlık ile yazmak istiyorsanız, yukarıdaki 'Ad'ı' 'olarak seçmeniz yeterlidir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.