Нечетное отбрасывание pandas строк в зависимости от условий - PullRequest
0 голосов
/ 16 апреля 2020

Я использую функцию:

def df_proc(df, n):
    print (list(df.lab).count(0)) # control label to see if it changes after conditional dropping
    print ('C:', list(df.lab).count(1))

    df = df.drop(df[df.lab.eq(0)].sample(n).index)

    print (list(df.lab).count(0))
    print ('C:', list(df.lab).count(1))

    return df

Чтобы удалить pandas строк на основе определенных условий (где df.lab == 0). Это отлично работает на небольшом df (например, n = 100), однако, когда я увеличиваю количество строк в df, происходит что-то странное ... количество других меток (! = 0) также начинает уменьшаться и зависит от условия ..

Например:

# dummy example:
import random
list2 = [random.randrange(0, 6, 1) for i in range(1500000)] 
list1 = [random.randrange(0, 100, 1) for i in range(1500000)] 
dft = pd.DataFrame(list(zip(list1, list2)), columns = ['A', 'lab'])
dftest = df_proc(dft,100000)

дает ...

249797
C: 249585
149797
C: 249585

Но когда я запускаю это на моем фактическом df:

dftest = df_proc(S1,100000)

Я получаю странные изменения в ярлыках элементов управления.

467110
C: 70434
260616
C: 49395

Я не уверен, откуда могла возникнуть ошибка. Я пытался использовать frac и df.query('lab == 0'), но все еще сталкивался с той же ошибкой. Еще одна вещь, которую я заметил, заключается в том, что при небольших значениях n контрольные метки остаются неизменными, это происходит только при увеличении n.

dftest = df_proc(S1,1)

дает:

467110
C: 70434
467107
C: 70434

Что не суммируется, поскольку 3 образца были удалены не 1.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Ошибка заключалась в том, что при использовании drop он устраняется на основе index, однако мой df был конкатенацией нескольких кадров данных, поэтому мне пришлось использовать reset_index для решения проблемы.

0 голосов
/ 16 апреля 2020

Если речь идет только о фильтрации, почему бы не использовать:

dft = dft[dft['lab'] != 0]

Это отфильтрует все строки с lab=0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...