Ускорить поиск IF / ELIF по индексу в нескольких списках? - PullRequest
1 голос
/ 31 марта 2020

Есть ли более быстрый способ запуска следующего кода: (проверяет, есть ли значение в df.index в нескольких списках, и если да, то добавляет строку в один список и индекс в другой список)

truth = []
t_ind = []
for ind in df.index.values:
    if ind in t4:
        truth.append('a')
        t_ind.append(ind)
    elif ind in t8:
        truth.append('b')
        t_ind.append(ind)
    elif ind in nk:
        truth.append('c')
        t_ind.append(ind)
    elif ind in mono:
        truth.append('d')
        t_ind.append(ind)
    elif ind in b:
        truth.append('e')
        t_ind.append(ind)
    else:
        truth.append('Other')
        t_ind.append(ind)

, где t4, t8, mono, nk и b - отдельные списки со значениями индекса (int)

Ответы [ 2 ]

1 голос
/ 31 марта 2020

A numpy решение на основе. np.in1d возвращает все совпадающие позиции между двумя итерациями. Мы находим эти совпадающие позиции одну за другой итерируя по вашему сегменту индексов, т.е. t4, t8 et c. Дешевый хак на RHS с chr(97) = 'a'

# create a list with all the elements as 'Others' 
truth = np.repeat('Other', len(df))

# iterate over index groups and impute truth with the matching group
for i, idx_group in enumerate([t4, t8, mono, nk, b]):
    truth[np.where(np.in1d(df.index.values, idx_group))[0]] = chr(97+i)
1 голос
/ 31 марта 2020

Вы можете сделать один большой «индексный» дикт вместо проверки ключей в отдельных. В моем примере я предположил, что t4 или t8 это dits. если у вас есть DICT t4 = {'t4_1':'value_1', 't4_2': 'value_2'} и t8 = {'t8_1': 'value_1', 't8_2': 'value_2'}. Здесь вы не против ценностей. if ind in t4 означает, что вы проверяете ключ ind в поле t4 dict. dict.from_keys(t4.keys(), 'a') сделает dict {'t4_1':'a', 't4_2':'a'}'. dict.update () `просто обновляет все ключи в dict. вот как вы сделаете индекс всех ключей со значениями, которые вам нужны.

В случае, если t4 и t8 являются списками или наборами, да, это достаточно dict.from_keys(t4, 'a').

    idx = {}
    idx.update(dict.fromkeys(t4.keys(), 'a'))
    idx.update(dict.fromkeys(t8.keys(), 'b'))
    idx.update(dict.fromkeys(nk.keys(), 'c'))
    idx.update(dict.fromkeys(mono.keys(), 'd'))
    idx.update(dict.fromkeys(b.keys(), 'e'))

    truth = [idx.get(ind, 'Other') for ind in df.index.values]
    t_ind = df.index.values

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