Как отфильтровать и найти подмножество кадра данных, в котором категориальные данные в двух столбцах встречаются более чем в n, m раз - PullRequest
0 голосов
/ 03 июня 2019

У меня есть датафрейм из csv, который содержит userId, ISBN и рейтинги для нескольких книг. Я хочу найти подмножество этого фрейма данных, в котором оба идентификатора пользователя встречаются более 200 раз, а номера ISBN встречаются более 100 раз.

Вот что я попробовал:

ratings = pd.read_csv('../data/BX-Book-Ratings.csv', sep=';', error_bad_lines=False, encoding="latin-1")
ratings.columns = ['userId', 'ISBN', 'bookRating']

# Choose users with more than 200 ratings and books with more than 100 ratings

user_rating_count = ratings['userId'].value_counts()
relevant_ratings = ratings[ratings['userId'].isin(user_rating_count[user_rating_count >= 200].index)]
print(relevant_ratings.head())
print(relevant_ratings.shape)
books_rating_count = relevant_ratings['ISBN'].value_counts()
relevant_ratings_book = relevant_ratings[relevant_ratings['ISBN'].isin(
    books_rating_count[books_rating_count >= 100].index)]
print(relevant_ratings_book.head())
print(relevant_ratings_book.shape)

# Check that userId occurs more than 200 times

users_grouped = pd.DataFrame(relevant_ratings.groupby('userId')['bookRating'].count()).reset_index()
users_grouped.columns = ['userId', 'ratingCount']
sorted_users = users_grouped.sort_values('ratingCount')
print(sorted_users.head())

# Check that ISBN occurs more than 100 times

books_grouped = pd.DataFrame(relevant_ratings.groupby('ISBN')['bookRating'].count()).reset_index()
books_grouped.columns = ['ISBN', 'ratingCount']
sorted_books = books_grouped.sort_values('ratingCount')
print(sorted_books.head())

Ниже приведен вывод, который я получил:

      userId        ISBN  bookRating
1456  277427  002542730X          10
1457  277427  0026217457           0
1458  277427  003008685X           8
1459  277427  0030615321           0
1460  277427  0060002050           0
(527556, 3)
      userId        ISBN  bookRating
1469  277427  0060930535           0
1471  277427  0060934417           0
1474  277427  0061009059           9
1495  277427  0142001740           0
1513  277427  0312966091           0
(13793, 3)
     userId  ratingCount
73    26883          200
298   99955          200
826  252827          200
107   36554          200
240   83671          200
               ISBN  ratingCount
0        0330299891            1
132873   074939918X            1
132874   0749399201            1
132875   074939921X            1
132877   0749399295            1

Как видно выше, при сортировке таблицы в порядке возрастания, сгруппированном по userId, он показывает userIds только более 200 раз. Но при сортировке таблицы по возрастанию, сгруппированной по ISBN, она показывает номера ISBN, которые встречаются даже 1 раз.

Я ожидал, что и идентификаторы пользователей, и номера ISBN будут появляться более 200 и 100 раз соответственно. Пожалуйста, дайте мне знать, что я сделал неправильно и как получить правильный результат.

1 Ответ

0 голосов
/ 03 июня 2019

Вы должны попытаться создать небольшую версию проблемы, которая может быть решена без доступа к большим CSV-файлам.Проверьте эту страницу для более подробной информации: https://stackoverflow.com/help/how-to-ask

Тем не менее, вот фиктивная версия вашего набора данных:

import pandas as pd
import random
import string
n=1000
isbn = [random.choice(['abc','def','ghi','jkl','mno']) for x in range(n)]
rating = [random.choice(range(9)) for x in range(n)]
userId = [random.choice(['x','y','z']) for x in range(n)]
df = pd.DataFrame({'isbn':isbn,'rating':rating,'userId':userId})

Вы можете получить счет по userId и isbns следующим образом:

df_userId_count = df.groupby('userId',as_index=False)['rating'].count()
df_isbn_count = df.groupby('isbn',as_index=False)['rating'].count()

и извлеките уникальные значения с помощью:

userId_select = (df_userId_count[df_userId_count.rating>200].userId.values)
isbn_select = (df_isbn_count[df_isbn_count.rating>100].isbn.values)

, чтобы ваш последний отфильтрованный кадр данных был:

df = df[df.userId.isin(userId_select) & df.isbn.isin(isbn_select) ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...