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?
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
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
.
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