@pintel

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

Есть два датафрейма
df1 = pd.DataFrame({'id': [24, 75, 32, 89]})
df2 = pd.DataFrame({'id': [4, 87, 145, 99, 175],
                    'lst': [[24, 56, 78], [24, 32, 89, 54, 127], [67], [78, 89, 34], [12, 45]]})

Как найти все строки в df2, чтобы значения df1['id] были в списках.

Решение через циклы - слишком медленно
df3 = pd.DataFrame()
for i in df2.itertuples():
    for j in df1.itertuples():
        if j[1] in i[2]:
            df3 = df3.append({'id': i[1], 'lst': i[2]}, ignore_index=True)


Метод isin() в данном случае не работает
for j in df1.itertuples():
    df3 = df2[df2['id'].isin(j[1])]


Нужен такой результат
id                    lst
0   4           [24, 56, 78]
1  87  [24, 32, 89, 54, 127]
2  99           [78, 89, 34]
  • Вопрос задан
  • 1845 просмотров
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Вот, нацарапал на салфетке:
import pandas as pd
df1 = pd.DataFrame({'id': [24, 75, 32, 89]})
df2 = pd.DataFrame({'id': [4, 87, 145, 99, 146],
                    'lst': [[24, 56, 78], [24, 32, 89, 54, 127], [67], [78, 89, 34], [12, 45]]})

f1 = set(df1['id'])
df22 = df2.set_index('id')

for ident in df22.index:
    f2 = set(df22['lst'][ident])
    result = list(f1&f2)
    if len(result):
        print(ident, list(result))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
LazyTalent
@LazyTalent
Data Engineer, Freelancer
Как не крутись, но любое решение будет O(n^2), соответсвенно, чтобы это всё отработало максимально быстро, тебе необходимо делать всё при помощи pandas. Но с такой архитектурой df2 у тебя это наврядли получиться, так что думай как преобразовать исходные датафреймы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы