web-dev-qa-db-fra.com

Comment se débarrasser de `Sans nom:` colonne dans une base de données de pandas

J'ai une situation dans laquelle parfois, quand je lis une csv à partir de df, je reçois une colonne indésirable de type index nommée unnamed:0. C'est très énervant! j'ai essayé 

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

que je pensais être une solution à cela, mais je reçois toujours la colonne unnamed:0! Quelqu'un a-t-il une idée à ce sujet?

68
Michael Perdue

C'est la colonne d'index, passez index=False pour ne pas l'écrire, voir le docs

Exemple:

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

comparer avec:

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

Vous pouvez aussi éventuellement indiquer à read_csv que la première colonne est la colonne d'index en passant 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
96
EdChum

Cela peut également se produire si vos données ont été mal écrites dans votre csv pour que chaque ligne se termine par une virgule. Cela vous laissera avec une colonne non nommée Unnamed: x à la fin de vos données lorsque vous essayez de la lire dans une df.

5
Brendan

Si vous n’êtes pas en mesure de supprimer l’index lors de l’enregistrement au format CSV (c’est-à-dire si le fichier CSV provient d’amont), l’autre option consiste à utiliser index_col=[0] avec pd.read_csv . IOW, manipulez-le en lisant, pas en écrivant.

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

Vous pouvez également filtrer avec 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
0
coldspeed