Python Pandas Groupby, кажется, удаляет строки из моих данных - PullRequest
0 голосов
/ 09 июня 2018

Если я это сделаю

rr = pd.read_csv( 'refinedRatings.csv' ) 
lookrr = rr.loc[rr['user_id'] == 1]
lookrr.head(30)

Мои данные выглядят примерно так

Unnamed:0   user_id book_id rating
0                0              1   258    5
59           78         1    1796  5
148900  230483  1   4691    4
148901  230485  1   2063    4
148902  230489  1   11     5
148903  230490  1   1644    5
148904  230492  1   136    5
148905  230493  1   6665    4
148906  230495  1   35  5
148907  230496  1   33  4
148908  230500  1   10  4
148909  230502  1   4        5
148910  230505  1   1521    5
148911  230506  1   70  5
148912  230509  1   36  4
148913  230512  1   32  4
148914  230513  1   13  4
148915  230514  1   66  4

Поскольку это не совсем понятно из-за форматирования в стеке, вот изображение https://snag.gy/FyanEs.jpg

Но если я использую group by вот так

rr = pd.read_csv( 'refinedRatings.csv' ) 
rrgb= rr.groupby('user_id')
rrgb.head(200)

Тогда данные снова будут выглядеть так

Unnamed: 0  user_id book_id rating
0   0   1   258 5
1   1   2   4081    4
2   2   2   260 5
3   3   2   9296    5
4   5   2   26  4
5   7   2   33  4
6   8   2   301 5
7   9   2   2686    5
8   10  2   3753    5
9   11  2   8519    5
10  12  4   70  4
11  14  4   388 4
12  15  4   18  5
13  16  4   27  5
14  17  4   21  5
15  18  4   2   5
16  19  4   23  5
17  20  4   24  5

, image https://snag.gy/JugXGe.jpg

Так что кажется, чтогруппировка по операции исключает несколько строк, где 'user_id' равен 1.

Есть ли какое-либо объяснение этому?

Вот прямая ссылка на данные

https://drive.google.com/open?id=1v7Mm6S8BVtou1iIfobY43LRF8MgGdjfU

Также для исходного источника данных

https://github.com/zygmuntz/goodbooks-10k

Редактировать:

Я также установил индекс на user_id ирезультат такой же, как когда я использовал groupby

код

rrfinal = pd.read_csv( 'refinedRatings.csv' ).set_index('user_id')
rrfinal.head(50)

результаты

Unnamed: 0  book_id rating
user_id         
1   0   258 5
2   1   4081    4
2   2   260 5
2   3   9296    5
2   5   26  4
2   7   33  4
2   8   301 5
2   9   2686    5
2   10  3753    5
2   11  8519    5
4   12  70  4
4   14  388 4
4   15  18  5
4   16  27  5
4   17  21  5
4   18  2   5
4   19  23  5
4   20  24  5

Опять же, картина результатов https://snag.gy/RJTPvt.jpg

Редактировать:

В качестве меры предосторожности я преобразовал все записи в str, а затем обратно в int.

rr = rr.applymap(str)
rr = rr.applymap(int)

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

rr[rr['user_id'].apply(lambda x: type(x)==str)]
rr.head(200)

Результат

    Unnamed: 0  user_id book_id rating
0   0   1   258 5
1   1   2   4081    4
2   2   2   260 5
3   3   2   9296    5
4   5   2   26  4
5   7   2   33  4
6   8   2   301 5
7   9   2   2686    5
8   10  2   3753    5
9   11  2   8519    5

И снова картинка результата https://snag.gy/QarSCN.jpg

1 Ответ

0 голосов
/ 09 июня 2018

@ SantoshGupta7: Уверяю вас, ваши данные не удаляются.Это выглядит так, потому что функция DataFrameGroupBy.head сохраняет исходный порядок данных.Если вы вызовете .count () или любую другую функцию агрегирования для вашего объекта groupby, вы увидите, что все ваши данные все еще там.

Чтобы приблизить ожидаемое поведение .head (), вы можете сделать следующее:

rr = pd.read_csv('refinedRatings.csv') 
rrgb = rr.groupby('user_id')

print(rrgb.apply(lambda x: x.head(200)))

                 Unnamed: 0  user_id  book_id  rating
user_id                                              
1       0                 0        1      258       5
        59               78        1     1796       5
        148900       230483        1     4691       4
        148901       230485        1     2063       4
        148902       230489        1       11       5
        148903       230490        1     1644       5
        148904       230492        1      136       5
        148905       230493        1     6665       4
        148906       230495        1       35       5
        148907       230496        1       33       4
        148908       230500        1       10       4
        148909       230502        1        4       5
        148910       230505        1     1521       5
        148911       230506        1       70       5
        148912       230509        1       36       4
        148913       230512        1       32       4

Вы заметите, что столбец "user_id" все еще присутствует.Это связано с особенностью функции groupby.head и / или тем фактом, что вы еще не выполняли агрегацию данных.

Пожалуйста, смотрите https://github.com/pandas-dev/pandas/issues/17775 для обсуждения вопроса "головы".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...