การลบคอลัมน์ดัชนีในแพนด้าเมื่ออ่าน csv


128

ฉันมีรหัสต่อไปนี้ซึ่งจะนำเข้าไฟล์ CSV มี 3 คอลัมน์และฉันต้องการตั้งค่าสองคอลัมน์แรกเป็นตัวแปร เมื่อฉันตั้งค่าคอลัมน์ที่สองเป็นตัวแปร "ประสิทธิภาพ" คอลัมน์ดัชนีจะถูกยึดไว้ด้วย ฉันจะกำจัดคอลัมน์ดัชนีได้อย่างไร

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

ฉันลองใช้

del df['index']

หลังจากที่ฉันตั้งค่า

energy = df.index

ซึ่งฉันพบในโพสต์อื่น แต่ส่งผลให้ "KeyError: 'index'"

คำตอบ:


70

DataFramesและSeriesจะมีดัชนีเสมอ แม้ว่าจะแสดงข้างคอลัมน์ แต่ก็ไม่ใช่คอลัมน์ซึ่งเป็นสาเหตุที่ใช้del df['index']ไม่ได้

df.reset_index()หากคุณต้องการที่จะเปลี่ยนดัชนีที่มีหมายเลขลำดับที่เรียบง่ายใช้งาน

ที่จะได้รับความรู้สึกว่าทำไมดัชนีอยู่ที่นั่นและวิธีการที่จะนำมาใช้ให้ดูเช่น10 นาทีถึงนุ่น


1
ขอบคุณ! ฉันตัดสินใจที่จะนำเข้าด้วยวิธีอื่นโดยไม่ใช้แพนด้า ฉันต้องคำนวณเลขคณิตในแต่ละคอลัมน์และ python ก็ไม่ชอบที่จะแนบคอลัมน์ดัชนี Pandas เป็นวิธีที่ง่ายที่สุดในการนำเข้าข้อมูล แต่ไม่ใช่วิธีที่ดีที่สุดที่ฉันค้นพบเสมอไป
Bogdan Janiszewski

2
คุณลองใช้นุ่นทำเลขคณิตดูไหม?
Jamie Bull

1
สามารถลบชื่อดัชนีได้หรือไม่?
Quant

3
ครับindex.name = None.
Dan Allan

1
@BogdanJaniszewski ถ้าคุณไม่ใช้แพนด้าทำไมคุณถึงยอมรับสิ่งนี้เป็นคำตอบ?
multigoodverse

251

เมื่ออ่านไปและกลับจากไฟล์ CSV ของคุณให้รวมอาร์กิวเมนต์index=Falseไว้ด้วยเช่น:

 df.to_csv(filename, index=False)

และอ่านจาก csv

df.read_csv(filename, index=False)  

วิธีนี้ควรป้องกันปัญหาดังนั้นคุณไม่จำเป็นต้องแก้ไขในภายหลัง


8
ขอบคุณมากนี่คือสิ่งที่กำลังมองหาคำถาม
Pale Blue Dot

1
"header = False" ใช้สำหรับการลบส่วนหัวในลักษณะเดียวกัน
J.Dahlgren

29
index_col=Falseควรจะเป็น
Vedda

1
การใช้df.to_sql("table",cursor,if_exists="append",index=False)ยังแก้ไขข้อผิดพลาด sqlitesqlite3.OperationalError: table message has no column named index
Anna

1
@vedda ดูเหมือนว่าจะเป็นindex=Falseสำหรับto_excel()และindex_col=Falseด้วยread_csv()ในแพนด้า 0.23.4 : - /
matt wilkie

70

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


2
นี่เป็นวิธีแก้ปัญหาที่ฉันชอบ แต่ไม่ใช่คำตอบที่ละเอียดมาก คู่มือนี้อ่านเกี่ยวกับอาร์กิวเมนต์drop: "อย่าพยายามแทรกดัชนีลงในคอลัมน์ dataframe ซึ่งจะรีเซ็ตดัชนีเป็นดัชนีจำนวนเต็มเริ่มต้น" pandas.pydata.org/pandas-docs/stable/generated/…
tommy.carstensen

@ tommy.carstensen แล้วคุณจะหลีกเลี่ยงการรับจำนวนเต็มในดัชนีแทนดัชนีก่อนหน้าได้อย่างไร? ฉันคิดว่าเป็นความเข้าใจผิดของข้อความในลิงก์ของคุณ คำถามที่นี่คือการลดลงของดัชนี และนี่ก็มาถึงแล้ว คุณได้รับจำนวนเต็มเริ่มต้นเนื่องจากไม่มีกรอบวันที่ที่ไม่มีดัชนี แต่คุณได้ทิ้งดัชนีก่อนหน้านี้ inplace=Trueนั่นคือเหตุผลที่คำตอบนี้ควรจะเป็นคำตอบที่ได้รับการยอมรับก็เพราะมันใช้หน่วยความจำที่มีประสิทธิภาพ
Lorenz

13

คุณสามารถตั้งค่าคอลัมน์ใดคอลัมน์หนึ่งเป็นดัชนีในกรณีที่เป็น "id" ได้เช่น ในกรณีนี้คอลัมน์ดัชนีจะถูกแทนที่ด้วยคอลัมน์ใดคอลัมน์หนึ่งที่คุณเลือก

df.set_index('id', inplace=True)

3

หากปัญหาของคุณเหมือนกับของฉันที่คุณต้องการรีเซ็ตส่วนหัวคอลัมน์จาก 0 เป็นขนาดคอลัมน์ ทำ

df = pd.DataFrame(df.values);

แก้ไข:

ไม่ใช่ความคิดที่ดีหากคุณมีประเภทข้อมูลที่แตกต่างกัน ดีกว่าเพียงแค่ใช้

df.columns = range(len(df.columns))

2

คุณสามารถระบุว่าคอลัมน์ใดเป็นดัชนีในไฟล์ csv ของคุณโดยใช้พารามิเตอร์ index_col ของฟังก์ชัน from_csv หากวิธีนี้ไม่สามารถแก้ปัญหาได้โปรดให้ตัวอย่างข้อมูลของคุณ


2

สิ่งหนึ่งที่ฉันทำคือdf=df.reset_index() ตอนนั้นdf=df.drop(['index'],axis=1)


ข้อผิดพลาด: "label ['index'] ไม่มีอยู่ในแกน"
Vasin Yuriy

@VasinYuriy นี้มีความหมายเหมือนdf.reset_index().drop(columns=['yourfirstindex', 'yoursecondindex'])จะทำงานร่วมกับ 'ดัชนี' เฉพาะในกรณีที่มาตรฐานที่ดัชนีไม่ได้มีชื่อและแล้วจะกลายเป็นคอลัมน์ที่เรียกว่า 'ดัชนี' df.reset_index().drop(columns=['index'])ด้วย พารามิเตอร์ที่เพิ่มaxis=1เป็นค่าเริ่มต้น ไม่แนะนำให้ใช้วิธีนี้เพราะ @ SubhojitMukherjee reset_index(inplace=True)ทำงาน "inplace" จึงช่วยประหยัดหน่วยความจำ
Lorenz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.