ฉันคิดว่ามันควรจะง่าย แต่ฉันลองใช้ไอเดียบางอย่างแล้วก็ไม่ได้ผล
last_row = len(DF)
DF = DF.drop(DF.index[last_row]) #<-- fail!
ฉันลองใช้ดัชนีเชิงลบ แต่ก็ทำให้เกิดข้อผิดพลาด ฉันยังคงเข้าใจผิดบางอย่างพื้นฐาน
ฉันคิดว่ามันควรจะง่าย แต่ฉันลองใช้ไอเดียบางอย่างแล้วก็ไม่ได้ผล
last_row = len(DF)
DF = DF.drop(DF.index[last_row]) #<-- fail!
ฉันลองใช้ดัชนีเชิงลบ แต่ก็ทำให้เกิดข้อผิดพลาด ฉันยังคงเข้าใจผิดบางอย่างพื้นฐาน
คำตอบ:
ในการวาง n แถวสุดท้าย:
df.drop(df.tail(n).index,inplace=True) # drop last n rows
ด้วยเส้นเลือดเดียวกันคุณสามารถวาง n แถวแรก:
df.drop(df.head(n).index,inplace=True) # drop first n rows
DF[:-n]
โดยที่ n คือจำนวนแถวสุดท้ายที่จะวาง
ในการวางแถวสุดท้าย:
DF = DF[:-1]
ตั้งแต่การวางตำแหน่งของดัชนีในหลามคือ 0-based จะไม่มีจริงเป็นองค์ประกอบในที่สถานที่ที่สอดคล้องกับindex
len(DF)
คุณต้องเป็นlast_row = len(DF) - 1
:
In [49]: dfrm
Out[49]:
A B C
0 0.120064 0.785538 0.465853
1 0.431655 0.436866 0.640136
2 0.445904 0.311565 0.934073
3 0.981609 0.695210 0.911697
4 0.008632 0.629269 0.226454
5 0.577577 0.467475 0.510031
6 0.580909 0.232846 0.271254
7 0.696596 0.362825 0.556433
8 0.738912 0.932779 0.029723
9 0.834706 0.002989 0.333436
[10 rows x 3 columns]
In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]:
A B C
0 0.120064 0.785538 0.465853
1 0.431655 0.436866 0.640136
2 0.445904 0.311565 0.934073
3 0.981609 0.695210 0.911697
4 0.008632 0.629269 0.226454
5 0.577577 0.467475 0.510031
6 0.580909 0.232846 0.271254
7 0.696596 0.362825 0.556433
8 0.738912 0.932779 0.029723
[9 rows x 3 columns]
DF[:-1]
แต่มันง่ายมากที่จะเพียงแค่เขียน
ไม่มีใครแปลกใจที่นำสิ่งนี้ขึ้นมา:
# To remove last n rows
df.head(-n)
# To remove first n rows
df.tail(-n)
การทดสอบความเร็วบน DataFrame จำนวน 1,000 แถวแสดงให้เห็นว่าการแบ่งส่วนและhead
/ tail
เร็วกว่าการใช้งานประมาณ 6 เท่าdrop
:
>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
head()
และtail()
สร้างมุมมองในขณะที่drop()
เปลี่ยนการแสดงในหน่วยความจำ (ไม่ว่าจะเป็นการปรับเปลี่ยนแบบแทนที่หรือสร้างดาต้าเฟรมใหม่ทั้งหมด) ฉันไม่ได้ค้นหาสิ่งนี้ในเอกสารโปรดช่วยด้วย (ถ้านั่นคือความแตกต่าง: คำอธิบายที่ดีสำหรับความแตกต่างและต้องเลือกอย่างระมัดระวัง) /
head
, tail
และdrop
ผลตอบแทนทุกมุมมองแม้ว่ามันจะเป็นความจริงที่drop
จะช่วยให้คุณเลือกที่จะปรับเปลี่ยน inplace dataframe เดิม
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")
ผลลัพธ์ของสถิติ:
A B C
0 0.120064 0.785538 0.465853
1 0.431655 0.436866 0.640136
2 0.445904 0.311565 0.934073
3 0.981609 0.695210 0.911697
4 0.008632 0.629269 0.226454
5 0.577577 0.467475 0.510031
6 0.580909 0.232846 0.271254
7 0.696596 0.362825 0.556433
8 0.738912 0.932779 0.029723
9 0.834706 0.002989 0.333436
เพียงใช้ skipfooter=1
skipfooter: int ค่าเริ่มต้น 0
จำนวนบรรทัดที่ด้านล่างของไฟล์ที่จะข้าม
stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')
ผลลัพธ์ของ stats_2
A B C
0 0.120064 0.785538 0.465853
1 0.431655 0.436866 0.640136
2 0.445904 0.311565 0.934073
3 0.981609 0.695210 0.911697
4 0.008632 0.629269 0.226454
5 0.577577 0.467475 0.510031
6 0.580909 0.232846 0.271254
7 0.696596 0.362825 0.556433
8 0.738912 0.932779 0.029723
drop ส่งคืนอาร์เรย์ใหม่ดังนั้นจึงสำลักในโพสต์ og ฉันมีข้อกำหนดที่คล้ายกันในการเปลี่ยนชื่อส่วนหัวของคอลัมน์และลบบางแถวเนื่องจากไฟล์ csv ที่มีรูปแบบไม่ถูกต้องแปลงเป็น Dataframe ดังนั้นหลังจากอ่านโพสต์นี้ฉันจึงใช้:
newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)
และมันใช้งานได้ดีอย่างที่คุณเห็นด้วยสองบรรทัดที่แสดงความคิดเห็นด้านบนฉันลองใช้ drop. () วิธีการและมันใช้งานได้ แต่ไม่ดีและอ่านได้เหมือนกับการใช้ [n: -n] หวังว่าจะช่วยใครสักคนได้ขอบคุณ
เพียงแค่ใช้การจัดทำดัชนี
df.iloc[:-1,:]
นั่นเป็นเหตุผลที่ iloc มีอยู่ คุณยังสามารถใช้หัวหรือหาง
สำหรับ DataFrames ที่ซับซ้อนมากขึ้นซึ่งมี Multi-Index (พูดว่า "Stock" และ "Date") และต้องการลบแถวสุดท้ายสำหรับ Stock แต่ละตัวไม่ใช่แค่แถวสุดท้ายของ Stock สุดท้ายจากนั้นโซลูชันจะอ่าน:
# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)
# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)
ในฐานะที่groupby()
เป็นเพิ่มขึ้นอีกระดับเพื่อ reset_index()
Multi-ดัชนีเราก็วางไว้ที่ปลายใช้ df ที่ได้จะเก็บ Multi-Index ประเภทเดียวกับก่อนการดำเนินการ
DF = DF[:-1]
เหรอ?