Проверьте столбец панд на наличие последовательных значений строк - PullRequest
3 голосов
/ 27 марта 2019

У меня есть:

    hi     

0    1      
1    2      
2    4      
3    8    
4    3     
5    3    
6    2   
7    8    
8    3   
9    5     
10    4  

У меня есть список списков и одно целые числа, подобные этому:

[[2,8,3], 2, [2,8]]

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

Так что для одиночных целых чисел (т.е. 2) я хочу знать, когда это впервые появляется в столбце привет (индекс 1, но меня это не интересует)когда он появится снова, т.е. индекс 6)

Для списков в списке я хочу знать последний индекс того, когда список появляется в порядке в этом столбце.

Так что для [2,8,3], который появляется в порядке на индексах 6, 7 и 8, поэтому я хочу, чтобы 8 было возвращено.Обратите внимание, что он появляется и до этого, но вставляется через 4, поэтому меня это не интересует.

До сих пор я использовал:

for c in chunks:

        # different method if single note chunk vs. multi

        if type(c) is int:
           # give first occurence of correct single notes
           single_notes = df1[df1['user_entry_note'] == c]
           single_notes_list.append(single_notes)

        # for multi chunks
        else:
            multi_chunk = df1['user_entry_note'].isin(c)
            multi_chunk_list.append(multi_chunk)

1 Ответ

1 голос
/ 27 марта 2019

Вы можете сделать это с помощью np.logical_and.reduce + shift. Но есть много крайних случаев, чтобы иметь дело с:

import numpy as np

def find_idx(seq, df, col):
    if type(seq) != list:     # if not list
        s = df[col].eq(seq)
        if s.sum() >= 1:      # if something matched
            idx = s.idxmax().item()
        else:
            idx = np.NaN
    elif seq:                 # if a list that isn't empty
        seq = seq[::-1]       # to get last index
        m = np.logical_and.reduce([df[col].shift(i).eq(seq[i]) for i in range(len(seq))])
        s = df.loc[m]
        if not s.empty:       # if something matched
            idx = s.index[0]
        else:
            idx = np.NaN
    else:                     # empty list
        idx = np.NaN
    return idx

l = [[2,8,3], 2, [2,8]]
[find_idx(seq, df, col='hi') for seq in l]
#[8, 1, 7]

l = [[2,8,3], 2, [2,8], [], ['foo'], 'foo', [1,2,4,8,3,3]]
[find_idx(seq, df, col='hi') for seq in l]
#[8, 1, 7, nan, nan, nan, 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...