Menghapus kolom indeks di pandas saat membaca csv

128

Saya memiliki kode berikut yang mengimpor file CSV. Ada 3 kolom dan saya ingin mengatur dua kolom pertama menjadi variabel. Ketika saya mengatur kolom kedua ke variabel "efisiensi", kolom indeks juga ditempelkan. Bagaimana cara menghilangkan kolom indeks?

df = pd.DataFrame.from_csv('Efficiency_Data.csv', header=0, parse_dates=False)
energy = df.index
efficiency = df.Efficiency
print efficiency

Saya mencoba menggunakan

del df['index']

setelah saya set

energy = df.index

yang saya temukan di posting lain tetapi itu menghasilkan "KeyError: 'index'"

Bogdan Janiszewski
sumber

Jawaban:

70

DataFrames dan Series selalu memiliki indeks. Meskipun ditampilkan di samping kolom, itu bukan kolom, itulah sebabnya del df['index']tidak berfungsi.

Jika Anda ingin mengganti indeks dengan nomor urut sederhana, gunakan df.reset_index().

Untuk memahami mengapa indeks itu ada dan bagaimana indeks itu digunakan, lihat misalnya 10 menit ke Pandas .

Dan Allan
sumber
1
Terima kasih! Saya memutuskan untuk mengimpornya dengan cara yang berbeda tidak menggunakan panda. Saya harus melakukan beberapa aritmatika pada masing-masing kolom dan python tidak suka kolom indeks terpasang. Panda jelas merupakan cara termudah untuk mengimpor data, tetapi tidak selalu yang terbaik yang saya temukan.
Bogdan Janiszewski
2
Apakah Anda mencoba menggunakan Pandas untuk menghitung?
Jamie Bull
1
dapatkah seseorang menghapus nama indeks?
Kuantitas
3
Ya index.name = None,.
Dan Allan
1
@BogdanJaniszewski, jika Anda tidak menggunakan panda, lalu mengapa Anda menerima ini sebagai jawabannya?
multigoodverse
250

Saat membaca ke dan dari file CSV Anda menyertakan argumen, index=Falsejadi misalnya:

 df.to_csv(filename, index=False)

dan membaca dari csv

df.read_csv(filename, index=False)  

Ini akan mencegah masalah sehingga Anda tidak perlu memperbaikinya nanti.

Steve
sumber
8
Terima kasih banyak, inilah pertanyaan yang dicari.
Titik Biru Pucat
1
"header = False" berfungsi untuk menghapus header dengan cara yang sama
J.Dahlgren
29
seharusnya index_col=False.
Vedda
1
Menggunakan df.to_sql("table",cursor,if_exists="append",index=False)juga memperbaiki kesalahan sqlitesqlite3.OperationalError: table message has no column named index
Anna
1
@vedda tampaknya index=Falseuntuk to_excel()dan index_col=Falsedengan read_csv()di panda 0.23.4. : - /
matt wilkie
70

df.reset_index(drop=True, inplace=True)

Subhojit Mukherjee
sumber
2
Ini sebenarnya adalah solusi favorit saya, tetapi bukan jawaban yang sangat rumit. Manual membaca ini tentang argumen drop: "Jangan mencoba untuk memasukkan indeks ke dalam kolom dataframe. Ini menyetel ulang indeks ke indeks integer default." pandas.pydata.org/pandas-docs/stable/generated/…
tommy.carstensen
@ tommy.carstensen Lalu bagaimana Anda menghindari integer pada indeks sebagai pengganti dari indeks sebelumnya? Saya pikir ini adalah kesalahpahaman tentang teks tautan Anda. Pertanyaannya di sini adalah untuk menghapus indeks . Dan ini tercapai di sini. Anda mendapatkan bilangan bulat default, karena tidak ada kerangka tanggal tanpa indeks, tetapi Anda telah menghapus indeks sebelumnya. Itulah mengapa jawaban ini harus menjadi jawaban yang diterima, juga karena menggunakan memori yang efisien inplace=True.
Lorenz
13

Anda dapat mengatur salah satu kolom sebagai indeks jika itu adalah "id" misalnya. Dalam hal ini kolom indeks akan diganti dengan salah satu kolom yang Anda pilih.

df.set_index('id', inplace=True)
Natheer Alabsi
sumber
3

Jika masalah Anda sama dengan masalah saya di mana Anda hanya ingin mengatur ulang header kolom dari 0 menjadi ukuran kolom. Melakukan

df = pd.DataFrame(df.values);

EDIT:

Bukan ide yang baik jika Anda memiliki tipe data yang beragam. Lebih baik gunakan saja

df.columns = range(len(df.columns))
Bhanu Pratap Singh
sumber
2

Anda dapat menentukan kolom mana yang merupakan indeks di file csv Anda dengan menggunakan parameter index_col dari fungsi from_csv jika ini tidak menyelesaikan masalah Anda, berikan contoh data Anda

yemu
sumber
2

Satu hal yang saya lakukan adalah df=df.reset_index() kemudiandf=df.drop(['index'],axis=1)

Lord Varis
sumber
Kesalahan: "label ['indeks'] tidak terdapat dalam sumbu"
Vasin Yuriy
@VasinYuriy ini dimaksudkan seperti df.reset_index().drop(columns=['yourfirstindex', 'yoursecondindex']), ia bekerja dengan 'indeks' hanya dalam kasus standar di mana indeks tidak memiliki nama dan kemudian menjadi kolom yang disebut 'indeks' dengan df.reset_index().drop(columns=['index']). Parameter yang ditambahkan axis=1adalah default. Metode ini tidak disarankan, @ SubhojitMukherjee reset_index(inplace=True)bekerja "di tempat" dan dengan demikian menghemat memori.
Lorenz