Wie entferne ich die Spalte "Unbenannt: 0" in einem Pandas DataFrame?

152

Ich habe eine Situation, in der ich manchmal, wenn ich eine csvvon lese df, eine unerwünschte indexähnliche Spalte mit dem Namen bekomme unnamed:0.

file.csv

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

Die CSV wird folgendermaßen gelesen:

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

Das ist sehr nervig! Hat jemand eine Idee, wie man das loswird?

Michael Perdue
quelle

Antworten:

186

Es ist die Indexspalte, übergeben Sie, um index=Falsesie nicht auszuschreiben, siehe die Dokumente

Beispiel:

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

vergleichen mit:

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

Optional können Sie auch feststellen, read_csvdass die erste Spalte die Indexspalte ist, indem Sie Folgendes übergeben 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
quelle
Häufig enthalten die Datensätze, die Sie von anderen Stellen erhalten, diese Spalte bereits, sodass es nicht wirklich hilfreich ist, zu wissen, wie der "richtige" Datensatz mit den richtigen Parametern erstellt wird. Gibt es eine Möglichkeit, diese Spalte zu entfernen, wenn Sie sie laden, wenn sie bereits vorhanden ist?
Calvin Ku
2
@CalvinKu Leider gibt es kein skipcolsArgument dafür read_csv, nach dem Lesen in der CSV könnten Sie einfach tun df = df.drop(columns=df.columns[0])oder Sie könnten einfach die Spalten zuerst einlesen und dann die Spalten abzüglich der ersten Spalte so etwas wie übergeben cols = pd.read_csv( ....., nrows=1).columnsund dann erneut lesen. df = pd.read_csv(....., usecols=cols[1:])Dies vermeidet den Overhead des Lesens eine überflüssige Spalte und dann fallen lassen
EdChum
41

Dieses Problem tritt höchstwahrscheinlich auf, weil Ihre CSV zusammen mit ihrer RangeIndex(die normalerweise keinen Namen hat) gespeichert wurde . Das Update müsste tatsächlich beim Speichern des DataFrame durchgeführt werden, dies ist jedoch nicht immer eine Option.

Das Problem vermeiden: read_csvmit index_col Argument

IMO, die einfachste Lösung wäre, die unbenannte Spalte als Index zu lesen . Geben Sie ein index_col=[0]Argument an pd.read_csv, das in der ersten Spalte als Index gelesen wird.

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

Hinweis
Sie hätten dies in erster Linie vermeiden können, indem Sie index=Falsebeim Erstellen der Ausgabe-CSV verwendet haben, wenn Ihr DataFrame zunächst keinen Index hat.

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

Wie oben erwähnt, ist dies jedoch nicht immer eine Option.


Notlösung: Filtern mit str.match

Wenn Sie den Code zum Lesen / Schreiben der CSV-Datei nicht ändern können, können Sie die Spalte einfach entfernen, indem Sie filtern mit 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
quelle
1
Vielen Dank! Dieser index_col=[0]Fix löste leicht dieses lästige Problem von 'unbenannt: 0' und ersparte Code durch die ausführliche Neuerfindung des Rades.
user48115
1
Um unbenannte Spalten zu sehen, können Sie auch Regex wiedf.drop(df.filter(regex="Unname"),axis=1, inplace=True)
Sarah
8

Ein anderer Fall, in dem dies passieren könnte, ist, wenn Ihre Daten nicht ordnungsgemäß in Ihre Daten geschrieben csvwurden, damit jede Zeile mit einem Komma endet. Dadurch wird Unnamed: xam Ende Ihrer Daten eine unbenannte Spalte angezeigt, wenn Sie versuchen, sie in eine zu lesen df.

Brendan
quelle
2
Ich habe usecols=range(0,10)die unbenannte Spalte abgeschnitten
Nash
8

Um alle unbenannten Spalten abzurufen, können Sie auch Regex wie z df.drop(df.filter(regex="Unname"),axis=1, inplace=True)

Sarah
quelle
2

Löschen Sie diese Spalte einfach mit: del df['column_name']

ssareen
quelle