Jak pozbyć się kolumny „Unnamed: 0” w pandach DataFrame?

152

Mam sytuację, w której czasami, gdy czytam csvz df, otrzymuję niechcianą kolumnę o nazwie indeksowej unnamed:0.

file.csv

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

Plik CSV czyta się w ten sposób:

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

To bardzo irytujące! Czy ktoś ma pomysł, jak się tego pozbyć?

Michael Perdue
źródło

Odpowiedzi:

186

To kolumna indeksu, przejdź, index=Falseaby jej nie pisać, zobacz dokumentację

Przykład:

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

porównać z:

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

Możesz również opcjonalnie powiedzieć, read_csvże pierwsza kolumna jest kolumną indeksu, przekazując 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
źródło
Wiele razy zbiory danych, które otrzymujesz gdzie indziej, już zawierają tę kolumnę, więc nie pomaga wiedza, jak stworzyć „właściwy” zbiór danych przy użyciu odpowiednich parametrów. Czy istnieje sposób na wyeliminowanie tej kolumny podczas ładowania jej, gdy już tam jest?
Calvin Ku
2
@CalvinKu niestety nie ma skipcolsargumentu za read_csv, po przeczytaniu w csv mógłbyś po prostu zrobić df = df.drop(columns=df.columns[0])lub po prostu najpierw przeczytać kolumny, a następnie przekazać kolumny minus pierwsza kolumna coś w stylu, cols = pd.read_csv( ....., nrows=1).columnsa następnie ponownie przeczytać df = pd.read_csv(....., usecols=cols[1:])to pozwala uniknąć narzutu czytania zbędna kolumna, a następnie upuszczenie jej później
EdChum
43

Ten problem najprawdopodobniej występuje, ponieważ RangeIndexplik CSV został zapisany wraz z plikiem (który zwykle nie ma nazwy). Naprawa musiałaby zostać wykonana podczas zapisywania DataFrame, ale nie zawsze jest to opcja.

Unikanie problemu: read_csvz index_col argumentacją

IMO, najprostszym rozwiązaniem byłoby odczytanie nienazwanej kolumny jako indeksu . Podaj index_col=[0]argument do pd.read_csv, który wczyta pierwszą kolumnę jako 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

Uwaga Przede wszystkim
można było tego uniknąć, używając index=Falsepodczas tworzenia wyjściowego pliku CSV, jeśli DataFrame nie ma indeksu na początku.

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

Ale jak wspomniano powyżej, nie zawsze jest to opcja.


Rozwiązanie tymczasowe: filtrowanie za pomocą str.match

Jeśli nie możesz zmodyfikować kodu w celu odczytania / zapisu pliku CSV, możesz po prostu usunąć kolumnę, filtrując za pomocą 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
źródło
1
Wielkie dzięki! Ta index_col=[0]poprawka z łatwością rozwiązała ten irytujący problem „nienazwanego: 0” i oszczędza kod przed szczegółowym wymyślaniem koła.
user48115
1
Aby uzyskać dostęp do kolumn bez nazwy, możesz również użyć wyrażenia regularnego, takiego jakdf.drop(df.filter(regex="Unname"),axis=1, inplace=True)
Sarah,
8

Innym przypadkiem, w którym może się to zdarzyć, jest niepoprawne zapisanie danych w Twoim, csvaby każdy wiersz kończył się przecinkiem. Spowoduje to pozostawienie nienazwanej kolumny Unnamed: xna końcu danych podczas próby odczytania ich do pliku df.

Brendan
źródło
2
Zwykłem usecols=range(0,10)odcinać nienazwaną kolumnę
Nash
8

Aby uzyskać przejęcie wszystkich kolumn bez nazwy, możesz również użyć wyrażenia regularnego, takiego jak df.drop(df.filter(regex="Unname"),axis=1, inplace=True)

Sarah
źródło
2

Po prostu usuń tę kolumnę za pomocą: del df['column_name']

ssareen
źródło