Поиск общего значения столбца для набора значений другого столбца в pandas - PullRequest
0 голосов
/ 03 марта 2020

У меня есть этот фрейм данных. Я выбрал трех случайных пользователей из моих данных. Я хочу выбрать общие фильмы между этими выбранными пользователями в моем фрейме данных.

df 

  userId             movieId  ratings   
0       1                 500      3.5
1       1                 600      4.5
2       1                 700      2.0
3       1                 800      4.0
4       2                 500      3.5
5       2                 600      4.5
6       2                 9400     2.0
7       3                 800      4.0
8       3                 600      2.0
9       3                 500      4.0

Ожидаемый результат:

  userId             movieId  ratings   
0       1                 500      3.5
1       2                 500      3.5
2       3                 500      4.0
3       1                 600      4.5
4       2                 600      4.5
5       3                 600      2.0

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

def usersToMovies(rand_users):
    df1 = df.groupby('movieId')['userId'].apply(list).reset_index(name='users')
    # Check for rand_users in each list of users and filter rows.

Ответы [ 2 ]

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

Идея изменяется на DataFrame.pivot, поэтому для не распространенных movieId столбцов создаются пропущенные значения, поэтому вы можете удалить их с помощью DataFrame.dropna и изменить обратно с помощью DataFrame.unstack:

df1 = (df.pivot(index='userId', columns='movieId', values='ratings')
         .dropna(axis=1)
         .unstack()
         .reset_index(name='ratings'))
print (df1)
   movieId  userId  ratings
0      500       1      3.5
1      500       2      3.5
2      500       3      4.0
3      600       1      4.5
4      600       2      4.5
5      600       3      2.0
0 голосов
/ 03 марта 2020

Вы можете сделать прямой выбор из кадра данных. Преимущество такого подхода состоит в том, чтобы сохранить исходный индекс, если он имеет значение:

selection = df[df['movieId'].isin(df[['userId', 'movieId']].groupby('movieId').count()
                                  .reset_index().query('userId > 1')['movieId'])]

Он дает:

   userId  movieId  ratings
0       1      500      3.5
1       1      600      4.5
3       1      800      4.0
4       2      500      3.5
5       2      600      4.5
7       3      800      4.0
8       3      600      2.0
9       3      500      4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...