ฉันจะขยายโซลูชั่นทั่วไปของ @ User เพื่อให้drop
ทางเลือกฟรี สิ่งนี้มีไว้สำหรับผู้กำกับที่นี่ตามชื่อคำถาม (ไม่ใช่ปัญหาของ OP)
สมมติว่าคุณต้องการลบแถวทั้งหมดด้วยค่าลบ วิธีแก้ปัญหาหนึ่งคือ: -
df = df[(df > 0).all(axis=1)]
คำอธิบายทีละขั้นตอน: -
มาสร้างกรอบข้อมูลการแจกแจงแบบปกติ 5x5
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'))
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
1 -0.977278 0.950088 -0.151357 -0.103219 0.410599
2 0.144044 1.454274 0.761038 0.121675 0.443863
3 0.333674 1.494079 -0.205158 0.313068 -0.854096
4 -2.552990 0.653619 0.864436 -0.742165 2.269755
ปล่อยให้เงื่อนไขถูกลบเนกาทีฟ บูลีน df เป็นไปตามเงื่อนไข: -
df > 0
A B C D E
0 True True True True True
1 False True False False True
2 True True True True True
3 True True False True False
4 False True True False True
ชุดบูลีนสำหรับแถวทั้งหมดเป็นไปตามเงื่อนไข หมายเหตุหากองค์ประกอบใด ๆ ในแถวล้มเหลวตามเงื่อนไขแถวนั้นจะถูกทำเครื่องหมายเป็นเท็จ
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
ในที่สุดก็กรองแถวออกจากกรอบข้อมูลตามเงื่อนไข
df[(df > 0).all(axis=1)]
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
2 0.144044 1.454274 0.761038 0.121675 0.443863
คุณสามารถกำหนดกลับเป็น df เพื่อลบตัวกรอง vs ที่ทำไว้ด้านบน
df = df[(df > 0).all(axis=1)]
สามารถขยายได้อย่างง่ายดายเพื่อกรองแถวที่มี NaN s (รายการที่ไม่ใช่ตัวเลข): -
df = df[(~df.isnull()).all(axis=1)]
สิ่งนี้สามารถทำให้ง่ายขึ้นสำหรับกรณีเช่น: ลบแถวทั้งหมดที่คอลัมน์ E เป็นลบ
df = df[(df.E>0)]
ฉันอยากจะจบด้วยสถิติการทำโปรไฟล์ว่าทำไมdrop
โซลูชั่นของ @ User นั้นช้ากว่าการกรองตามคอลัมน์แบบดิบ
%timeit df_new = df[(df.E>0)]
345 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit dft.drop(dft[dft.E < 0].index, inplace=True)
890 µs ± 94.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
คอลัมน์นั้นโดยทั่วไปSeries
คือNumPy
อาร์เรย์มันสามารถสร้างดัชนีได้โดยไม่ต้องเสียค่าใช้จ่ายใด ๆ สำหรับผู้ที่สนใจว่าองค์กรหน่วยความจำพื้นฐานเล่นด้วยความเร็วในการดำเนินการที่นี่เป็นลิงค์ที่ดีในการเร่ง Pandas :
df[[(len(x) < 2) for x in df['column name']]]
แต่คุณดีกว่ามาก ขอบคุณสำหรับความช่วยเหลือของคุณ!