• Pandas. Поиск значений в столбце со списками?

    @pintel Автор вопроса
    Все-таки нашел решение при помощи Pandas
    search это df1
    gr_lst это df2
    print('len search: ' + str(len(search)))
    print('len gr_lst: ' + str(len(gr_lst)))
    start = time.process_time()
    f1 = set(search)
    df22 = gr_lst.set_index('id')
    df3 = pd.DataFrame()
    for ident in df22.index:
        f2 = set(df22['gr_list'][ident])
        result = f1&f2
        if len(result):
            chunk = pd.DataFrame({'id': ident, 'gr_list': list(result)})
            df3 = df3.append(chunk, ignore_index=True)
    print('time: ' + str(time.process_time() - start))
    print(df3)
    
    start = time.process_time()
    df_search = pd.DataFrame(gr_lst['gr_list'].apply(lambda x: list(set(x) & set(search))))
    df_search['id'] = gr_lst['id']
    # Удаляем строки с пустыми списками
    df_search = df_search[df_search['gr_list'].str.len() != 0]
    # Преобразуем столбец со списком значений в строки
    df_search = df_search['gr_list'].apply(lambda x: pd.Series(x)).stack().reset_index(level=1, drop=True).to_frame('gr_list').join(df_search[['id']])
    # Косметические преобразования
    df_search = df_search.astype({'gr_list': int}, copy=False).reset_index()
    df_search = df_search[['id', 'gr_list']]
    print('time: ' + str(time.process_time() - start))
    print(df_search)

    В итоге получаем
    len search: 3229
    len gr_lst: 60578
    time: 13.109375
                  id    gr_list
    0          46774  126842973
    1          46774  146897415
    2          72269    2507641
    3         128191   29046529
    4         128191   48437003
    ...          ...        ...
    31178  593502493  195837567
    31179  594033097   68291497
    31180  594033097   39438402
    31181  594033097  126842973
    31182  598864135  126842973
    
    [31183 rows x 2 columns]
    
    time: 10.0625
                  id    gr_list
    0          46774  126842973
    1          46774  146897415
    2          72269    2507641
    3         128191   29046529
    4         128191   48437003
    ...          ...        ...
    31178  593502493  195837567
    31179  594033097   68291497
    31180  594033097   39438402
    31181  594033097  126842973
    31182  598864135  126842973
    
    [31183 rows x 2 columns]
  • Pandas. Поиск значений в столбце со списками?

    @pintel Автор вопроса
    Алан Гибизов, Эти датафреймы просто, как пример.