เลือกแถวที่มีค่ามากกว่า V ในคอลัมน์มากกว่า C

ฉันมี dataframe แพนด้าต่อไปนี้

Index   A   B   C   D
----------------------
1       2   0   0   10
2       0   3   6   0
3       4   3   2   0
4       3   2   6   3
5       1   1   1   0

ฉันต้องการสอบถาม dataframe นี้เพื่อเลือกแถวทั้งหมดที่มีค่า มากกว่า มากกว่า 1 (V) ในคอลัมน์ มากกว่า 2 (C)

ในกรณีนี้ แถวที่เลือกจะเป็นดัชนี 3 และ 4 จะถูกเลือกเนื่องจากมีค่ามากกว่า 1 ปรากฏในมากกว่า 2 คอลัมน์ ได้แก่ ดัชนี 3 มี 4, 3, 2 (มากกว่า 1 ทั้งหมด) ปรากฏใน A, B, C เช่น 3 คอลัมน์ และในทำนองเดียวกัน ดัชนี 4 มีค่า 3, 2, 6, 3 (มากกว่า 1 ทั้งหมด) ปรากฏใน A, B, C และ D คือ 4 คอลัมน์

ผลผลิตที่คาดหวัง

Index   A   B   C   D
----------------------
3       4   3   2   0
4       3   2   6   3

person Afsan Abdulali Gujarati    schedule 27.12.2018    source แหล่งที่มา


คำตอบ (1)


คุณสามารถสร้างมาสก์ต่อไปนี้เพื่อเลือกแถว:

import pandas as pd

data = [[2, 0, 0, 10],
        [0, 3, 6, 0],
        [4, 3, 2, 0],
        [3, 2, 6, 3],
        [1, 1, 1, 0]]

df = pd.DataFrame(data=data, columns=list('ABCD'))
mask = (df.values > 1).sum(axis=1) > 2
print(df[mask])

เอาต์พุต

   A  B  C  D
2  4  3  2  0
3  3  2  6  3

แนวคิดหลักของการสร้างมาสก์คือการสร้างอาร์เรย์ของค่าบูลีน โดยที่ True หมายถึงค่ามากกว่า 1 จากนั้นให้รวมค่าเหล่านั้นข้ามแถว และหากผลรวมมากกว่า 2 แสดงว่ามีค่ามากกว่า 2 ค่าที่อยู่เหนือ 1

อีกทางเลือกหนึ่ง คุณสามารถใช้ numpy.count_nonzero เพื่อสร้างมาสก์:

import pandas as pd
import numpy as np

data = [[2, 0, 0, 10],
        [0, 3, 6, 0],
        [4, 3, 2, 0],
        [3, 2, 6, 3],
        [1, 1, 1, 0]]

df = pd.DataFrame(data=data, columns=list('ABCD'))
mask = np.count_nonzero(df.values > 1, axis=1) > 2
print(df[mask])

เอาต์พุต

   A  B  C  D
2  4  3  2  0
3  3  2  6  3
person Dani Mesejo    schedule 27.12.2018