この問題は、CSVがRangeIndex
(通常は名前が付いていない)と共に保存されたために発生する可能性があります。修正は実際にはDataFrameを保存するときに行う必要がありますが、これは常にオプションとは限りません。
問題の回避:read_csv
とindex_col
引数
IMO、最も簡単な解決策は、名前のない列をインデックスとして読み取ることです。にindex_col=[0]
引数を指定するpd.read_csv
と、最初の列がインデックスとして読み込まれます。
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
注 DataFrameに開始するインデックスがない場合は、出力CSVの作成時にを
使用index=False
することで、これを最初に回避できた可能性があります。
df.to_csv('file.csv', index=False)
しかし、上記のように、これは常にオプションであるとは限りません。
Stopgap Solution:フィルタリング str.match
CSVファイルを読み書きするようにコードを変更できない場合は、次のようにフィルタリングして列を削除できます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