Какой самый эффективный способ найти пересечения из дополнительных таблиц на основе пары столбцов в pandas DataFrame? - PullRequest
1 голос
/ 16 июня 2020

У меня есть 3 DataFrame в Pandas:

UserItem - это DataFrame пользователей и элементов, выбранных пользователями, с 2 столбцами, User и Item.

UserTag - это фрейм данных пользователей и тегов с двумя столбцами: User и Tag.

ItemTag - это DataFrame элементов и тегов с 2 столбцами, Item и Tag.

UserItem_df = pd.DataFrame({'user': ['A', 'B', 'B']      ,  'item': ['i', 'j', 'k']})
UserTag_df  = pd.DataFrame({'user': ['A', 'B']           ,  'tag' : ['T', 'R']})
ItemTag_df  = pd.DataFrame({'item': ['i', 'j', 'k', 'k'] ,  'tag' : ['T', 'S', 'T', 'R']})

Я хочу вычислить для каждой пары (пользователь, элемент) в UserItem размер пересечения (а также объединения!) Тегов этого пользователя с тегами этого элемента.

Answer_df = pd.DataFrame({'user': ['A', 'B', 'B']  , 'item': ['i', 'j', 'k'], 'intersection':  [1, 0, 1], 'union' : [1, 2, 2]})

Какой самый эффективный способ сделать это? Это DataFrames с 30 миллионами строк (UserItem_df) и около 500 тысяч строк для двух других. Набор продуктов всех возможных пар (пользователь, элемент) составляет около 30 миллиардов - мне не нужны пересечения и объединения для всех возможных пар, только те, которые находятся во фрейме данных UserItem.

1 Ответ

1 голос
/ 16 июня 2020

Используйте:

# step 1:
df1 = pd.merge(UserItem_df, UserTag_df, on='user')

# step 2:
df2 = pd.merge(UserItem_df, ItemTag_df, on='item')

# step 3
df3 = pd.concat([df1, df2], ignore_index=True)

# step 4
df3 = (
    df3.groupby(['user', 'item'])['tag']
    .agg(intersection='count', union='nunique')
    .reset_index()
)
df3['intersection'] -= df3['union']

Шаги:

# step 1: df1
  user item tag
0    A    i   T
1    B    j   R
2    B    k   R

# step 2: df2
  user item tag
0    A    i   T
1    B    j   S
2    B    k   T
3    B    k   R

# step 3: df3
  user item tag
0    A    i   T
1    B    j   R
2    B    k   R
3    A    i   T
4    B    j   S
5    B    k   T
6    B    k   R

# step 4: df3
  user item  intersection  union
0    A    i             1      1
1    B    j             0      2
2    B    k             1      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...