it-swarm.com.de

Wie loszuwerden? Unbenannte: `Spalte in einem Pandas Dataframe

Ich habe eine Situation, in der ich manchmal, wenn ich eine csv von df lese, eine unerwünschte indexähnliche Spalte namens unnamed:0 erhalte. Das ist sehr nervig! Ich habe versucht 

merge.to_csv('xy.df', mode = 'w', inplace=False)

ich dachte, das wäre eine Lösung dafür, aber ich bekomme immer noch die unnamed:0-Spalte! Hat jemand eine Idee dazu?

68
Michael Perdue

Es ist die Indexspalte, übergeben Sie index=False, um sie nicht ausschreiben zu können, siehe docs

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

Sie können read_csv optional auch mitteilen, dass die erste Spalte die Indexspalte ist, indem Sie index_col=0 übergeben:

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
96
EdChum

Ein weiterer Fall könnte eintreten, wenn Ihre Daten nicht ordnungsgemäß in Ihre csv geschrieben wurden, damit jede Zeile mit einem Komma endet. Dadurch wird eine ungenannte Spalte Unnamed: x am Ende Ihrer Daten angezeigt, wenn Sie versuchen, sie in eine df zu lesen.

5
Brendan

Wenn Sie den Index beim Speichern in CSV nicht entfernen können (d. H., Wenn die CSV-Datei vom Upstream stammt), können Sie index_col=[0] mit pd.read_csv verwenden. IOW, handle es beim Lesen, nicht beim Schreiben.

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

Alternativ können Sie auch mit str.match filtern:

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
0
coldspeed