วิธีลบข้อมูลแถวสุดท้ายของกรอบข้อมูลแพนด้า


122

ฉันคิดว่ามันควรจะง่าย แต่ฉันลองใช้ไอเดียบางอย่างแล้วก็ไม่ได้ผล

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

ฉันลองใช้ดัชนีเชิงลบ แต่ก็ทำให้เกิดข้อผิดพลาด ฉันยังคงเข้าใจผิดบางอย่างพื้นฐาน


30
DF = DF[:-1]เหรอ?
U2EF1

@ U2EF1 นี่คัดลอกชุดข้อมูลทั้งหมดใช่ไหม เมื่อจัดการกับข้อมูลขนาดใหญ่อาจเป็นปัญหา
ManuelSchneid3r

คำตอบ:


186

ในการวาง 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.drop (df.columns [-1], axis = 1, inplace = True) หรือหากคุณทราบชื่อคอลัมน์คุณสามารถใช้ df.drop (คอลัมน์ = ['col_name '], inplace = True) - หากคุณไม่ต้องการให้ดำเนินการในสถานที่ให้กำหนดให้กับตัวแปรใหม่และลบอาร์กิวเมนต์นั้น
Shawn Schreier


60

ตั้งแต่การวางตำแหน่งของดัชนีในหลามคือ 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]แต่มันง่ายมากที่จะเพียงแค่เขียน


2
โปรดทราบว่าเมื่อวางโดยใช้ dfrm.index ดัชนีของแถวสุดท้ายควรไม่ซ้ำกันมิฉะนั้นแถวทั้งหมดที่มีดัชนีนั้นจะถูกทิ้ง
FranciscoD

ฉันเข้าใจถูกต้องหรือไม่ว่าการใช้ drop (inplace = True) คุณปรับเปลี่ยน df ที่มีอยู่ในขณะที่ใช้ df [: - 1] คุณจะได้รับมุมมองข้อมูลซึ่งจะนำไปสู่ ​​SettingWithCopyWarning ในภายหลัง
Philipp

31

ไม่มีใครแปลกใจที่นำสิ่งนี้ขึ้นมา:

# 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()เปลี่ยนการแสดงในหน่วยความจำ (ไม่ว่าจะเป็นการปรับเปลี่ยนแบบแทนที่หรือสร้างดาต้าเฟรมใหม่ทั้งหมด) ฉันไม่ได้ค้นหาสิ่งนี้ในเอกสารโปรดช่วยด้วย (ถ้านั่นคือความแตกต่าง: คำอธิบายที่ดีสำหรับความแตกต่างและต้องเลือกอย่างระมัดระวัง) /
ดร. Jan-Philip Gehrcke

@ Dr.Jan-PhilipGehrcke หัวhead, tailและdropผลตอบแทนทุกมุมมองแม้ว่ามันจะเป็นความจริงที่dropจะช่วยให้คุณเลือกที่จะปรับเปลี่ยน inplace dataframe เดิม
theGirrafish

5
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

1

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] หวังว่าจะช่วยใครสักคนได้ขอบคุณ


1

เพียงแค่ใช้การจัดทำดัชนี

df.iloc[:-1,:]

นั่นเป็นเหตุผลที่ iloc มีอยู่ คุณยังสามารถใช้หัวหรือหาง


2
ลองขยายคำตอบของคุณและอธิบายว่าโซลูชันของคุณทำงานอย่างไรและทำไม
MLarionov

0

สำหรับ 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 ประเภทเดียวกับก่อนการดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.