Campaigns are moving away from the meaningless labels of pollsters and newsweeklies — “Nascar dads” and “waitress moms” — and moving toward treating each voter as a separate person. In 2012 you didn’t just have to be an African-American from Akron or a suburban married female age 45 to 54. More and more, the information age allows people to be complicated, contradictory and unique. New technologies and an abundance of data may rattle the senses, but they are also bringing a fresh appreciation of the value of the individual to American politics.
- Ethan Roeder, “I Am Not Big Brother” http://www.nytimes.com/2012/12/06/opinion/i-am-not-big-brother.html?_r=0.
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
We'll be using the MovieLens data set with 100K ratings from http://grouplens.org/datasets/movielens/. There you can find much bigger sets.
In the midst of writing this, I discovered a great blog post using pandas
on the same data: http://www.gregreda.com/2013/10/26/using-pandas-on-the-movielens-dataset/. The approach and tools are slightly different. Worth checking out!
#First, let's look at what the files are.
!ls ml-100k
allbut.pl u1.base u3.base u5.base ub.base u.info mku.sh u1.test u3.test u5.test ub.test u.item ml-100k.tar.gz u2.base u4.base ua.base u.data u.occupation README u2.test u4.test ua.test u.genre u.user
!cat ml-100k/README
SUMMARY & USAGE LICENSE ============================================= MovieLens data sets were collected by the GroupLens Research Project at the University of Minnesota. This data set consists of: * 100,000 ratings (1-5) from 943 users on 1682 movies. * Each user has rated at least 20 movies. * Simple demographic info for the users (age, gender, occupation, zip) The data was collected through the MovieLens web site (movielens.umn.edu) during the seven-month period from September 19th, 1997 through April 22nd, 1998. This data has been cleaned up - users who had less than 20 ratings or did not have complete demographic information were removed from this data set. Detailed descriptions of the data file can be found at the end of this file. Neither the University of Minnesota nor any of the researchers involved can guarantee the correctness of the data, its suitability for any particular purpose, or the validity of results based on the use of the data set. The data set may be used for any research purposes under the following conditions: * The user may not state or imply any endorsement from the University of Minnesota or the GroupLens Research Group. * The user must acknowledge the use of the data set in publications resulting from the use of the data set, and must send us an electronic or paper copy of those publications. * The user may not redistribute the data without separate permission. * The user may not use this information for any commercial or revenue-bearing purposes without first obtaining permission from a faculty member of the GroupLens Research Project at the University of Minnesota. If you have any further questions or comments, please contact Jon Herlocker <herlocke@cs.umn.edu>. ACKNOWLEDGEMENTS ============================================== Thanks to Al Borchers for cleaning up this data and writing the accompanying scripts. PUBLISHED WORK THAT HAS USED THIS DATASET ============================================== Herlocker, J., Konstan, J., Borchers, A., Riedl, J.. An Algorithmic Framework for Performing Collaborative Filtering. Proceedings of the 1999 Conference on Research and Development in Information Retrieval. Aug. 1999. FURTHER INFORMATION ABOUT THE GROUPLENS RESEARCH PROJECT ============================================== The GroupLens Research Project is a research group in the Department of Computer Science and Engineering at the University of Minnesota. Members of the GroupLens Research Project are involved in many research projects related to the fields of information filtering, collaborative filtering, and recommender systems. The project is lead by professors John Riedl and Joseph Konstan. The project began to explore automated collaborative filtering in 1992, but is most well known for its world wide trial of an automated collaborative filtering system for Usenet news in 1996. The technology developed in the Usenet trial formed the base for the formation of Net Perceptions, Inc., which was founded by members of GroupLens Research. Since then the project has expanded its scope to research overall information filtering solutions, integrating in content-based methods as well as improving current collaborative filtering technology. Further information on the GroupLens Research project, including research publications, can be found at the following web site: http://www.grouplens.org/ GroupLens Research currently operates a movie recommender based on collaborative filtering: http://www.movielens.org/ DETAILED DESCRIPTIONS OF DATA FILES ============================================== Here are brief descriptions of the data. ml-data.tar.gz -- Compressed tar file. To rebuild the u data files do this: gunzip ml-data.tar.gz tar xvf ml-data.tar mku.sh u.data -- The full u data set, 100000 ratings by 943 users on 1682 items. Each user has rated at least 20 movies. Users and items are numbered consecutively from 1. The data is randomly ordered. This is a tab separated list of user id | item id | rating | timestamp. The time stamps are unix seconds since 1/1/1970 UTC u.info -- The number of users, items, and ratings in the u data set. u.item -- Information about the items (movies); this is a tab separated list of movie id | movie title | release date | video release date | IMDb URL | unknown | Action | Adventure | Animation | Children's | Comedy | Crime | Documentary | Drama | Fantasy | Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi | Thriller | War | Western | The last 19 fields are the genres, a 1 indicates the movie is of that genre, a 0 indicates it is not; movies can be in several genres at once. The movie ids are the ones used in the u.data data set. u.genre -- A list of the genres. u.user -- Demographic information about the users; this is a tab separated list of user id | age | gender | occupation | zip code The user ids are the ones used in the u.data data set. u.occupation -- A list of the occupations. u1.base -- The data sets u1.base and u1.test through u5.base and u5.test u1.test are 80%/20% splits of the u data into training and test data. u2.base Each of u1, ..., u5 have disjoint test sets; this if for u2.test 5 fold cross validation (where you repeat your experiment u3.base with each training and test set and average the results). u3.test These data sets can be generated from u.data by mku.sh. u4.base u4.test u5.base u5.test ua.base -- The data sets ua.base, ua.test, ub.base, and ub.test ua.test split the u data into a training set and a test set with ub.base exactly 10 ratings per user in the test set. The sets ub.test ua.test and ub.test are disjoint. These data sets can be generated from u.data by mku.sh. allbut.pl -- The script that generates training and test sets where all but n of a users ratings are in the training data. mku.sh -- A shell script to generate all the u data sets from u.data.
Take a close look at u.data
, u.item
, u.users
. How would you glance at the format in the Unix shell?
!head ml-100k/u.data
196 242 3 881250949 186 302 3 891717742 22 377 1 878887116 244 51 2 880606923 166 346 1 886397596 298 474 4 884182806 115 265 2 881171488 253 465 5 891628467 305 451 3 886324817 6 86 3 883603013
!head ml-100k/u.user
1|24|M|technician|85711 2|53|F|other|94043 3|23|M|writer|32067 4|24|M|technician|43537 5|33|F|other|15213 6|42|M|executive|98101 7|57|M|administrator|91344 8|36|M|administrator|05201 9|29|M|student|01002 10|53|M|lawyer|90703
!head ml-100k/u.item
1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0 2|GoldenEye (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?GoldenEye%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 3|Four Rooms (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Four%20Rooms%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0 4|Get Shorty (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Get%20Shorty%20(1995)|0|1|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0 5|Copycat (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Copycat%20(1995)|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|1|0|0 6|Shanghai Triad (Yao a yao yao dao waipo qiao) (1995)|01-Jan-1995||http://us.imdb.com/Title?Yao+a+yao+yao+dao+waipo+qiao+(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 7|Twelve Monkeys (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Twelve%20Monkeys%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0 8|Babe (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Babe%20(1995)|0|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0 9|Dead Man Walking (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Dead%20Man%20Walking%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0 10|Richard III (1995)|22-Jan-1996||http://us.imdb.com/M/title-exact?Richard%20III%20(1995)|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0
How do these data files relate to one another?
from IPython.display import Image
Image("http://imgur.com/ZhpRFTj.png")
What's missing? Duh, the labels!
Pandas
is clever, but not so clever as to infer labels not included in the file. It's not the google(tm).
README
gives us them. Let's copy them over by putting them into list of strings.
Exercise for the reader: Could you use `re.sub` to make this list of strings? Oh, you will, you will. (On the homework).
labels=["user_id","item_id","rating","timestamp"]
#arduously hand entered when should have spent 2 hours coding a way to do it automatically
individual_ratings=pd.read_csv( './ml-100k/u.data', sep="\t", names=labels) #\t because TAB separated
individual_ratings
user_id | item_id | rating | timestamp | |
---|---|---|---|---|
0 | 196 | 242 | 3 | 881250949 |
1 | 186 | 302 | 3 | 891717742 |
2 | 22 | 377 | 1 | 878887116 |
3 | 244 | 51 | 2 | 880606923 |
4 | 166 | 346 | 1 | 886397596 |
5 | 298 | 474 | 4 | 884182806 |
6 | 115 | 265 | 2 | 881171488 |
7 | 253 | 465 | 5 | 891628467 |
8 | 305 | 451 | 3 | 886324817 |
9 | 6 | 86 | 3 | 883603013 |
10 | 62 | 257 | 2 | 879372434 |
11 | 286 | 1014 | 5 | 879781125 |
12 | 200 | 222 | 5 | 876042340 |
13 | 210 | 40 | 3 | 891035994 |
14 | 224 | 29 | 3 | 888104457 |
15 | 303 | 785 | 3 | 879485318 |
16 | 122 | 387 | 5 | 879270459 |
17 | 194 | 274 | 2 | 879539794 |
18 | 291 | 1042 | 4 | 874834944 |
19 | 234 | 1184 | 2 | 892079237 |
20 | 119 | 392 | 4 | 886176814 |
21 | 167 | 486 | 4 | 892738452 |
22 | 299 | 144 | 4 | 877881320 |
23 | 291 | 118 | 2 | 874833878 |
24 | 308 | 1 | 4 | 887736532 |
25 | 95 | 546 | 2 | 879196566 |
26 | 38 | 95 | 5 | 892430094 |
27 | 102 | 768 | 2 | 883748450 |
28 | 63 | 277 | 4 | 875747401 |
29 | 160 | 234 | 5 | 876861185 |
... | ... | ... | ... | ... |
99970 | 449 | 120 | 1 | 879959573 |
99971 | 661 | 762 | 2 | 876037121 |
99972 | 721 | 874 | 3 | 877137447 |
99973 | 821 | 151 | 4 | 874792889 |
99974 | 764 | 596 | 3 | 876243046 |
99975 | 537 | 443 | 3 | 886031752 |
99976 | 618 | 628 | 2 | 891308019 |
99977 | 487 | 291 | 3 | 883445079 |
99978 | 113 | 975 | 5 | 875936424 |
99979 | 943 | 391 | 2 | 888640291 |
99980 | 864 | 685 | 4 | 888891900 |
99981 | 750 | 323 | 3 | 879445877 |
99982 | 279 | 64 | 1 | 875308510 |
99983 | 646 | 750 | 3 | 888528902 |
99984 | 654 | 370 | 2 | 887863914 |
99985 | 617 | 582 | 4 | 883789294 |
99986 | 913 | 690 | 3 | 880824288 |
99987 | 660 | 229 | 2 | 891406212 |
99988 | 421 | 498 | 4 | 892241344 |
99989 | 495 | 1091 | 4 | 888637503 |
99990 | 806 | 421 | 4 | 882388897 |
99991 | 676 | 538 | 4 | 892685437 |
99992 | 721 | 262 | 3 | 877137285 |
99993 | 913 | 209 | 2 | 881367150 |
99994 | 378 | 78 | 3 | 880056976 |
99995 | 880 | 476 | 3 | 880175444 |
99996 | 716 | 204 | 5 | 879795543 |
99997 | 276 | 1090 | 1 | 874795795 |
99998 | 13 | 225 | 2 | 882399156 |
99999 | 12 | 203 | 3 | 879959583 |
100000 rows × 4 columns
What's with that crazy number? According to the README
, it's "unix seconds." A quick google search explains how to convert using the pd.to.datetime
command. I will remember this just long enough to type the next few lines.
pd.to_datetime(individual_ratings["timestamp"], unit='s')
0 1997-12-04 15:55:49 1 1998-04-04 19:22:22 2 1997-11-07 07:18:36 3 1997-11-27 05:02:03 4 1998-02-02 05:33:16 5 1998-01-07 14:20:06 6 1997-12-03 17:51:28 7 1998-04-03 18:34:27 8 1998-02-01 09:20:17 9 1997-12-31 21:16:53 10 1997-11-12 22:07:14 11 1997-11-17 15:38:45 12 1997-10-05 09:05:40 13 1998-03-27 21:59:54 14 1998-02-21 23:40:57 ... 99985 1998-01-03 01:01:34 99986 1997-11-29 17:24:48 99987 1998-04-01 04:50:12 99988 1998-04-10 20:49:04 99989 1998-02-28 03:45:03 99990 1997-12-17 20:01:37 99991 1998-04-16 00:10:37 99992 1997-10-18 01:14:45 99993 1997-12-06 00:12:30 99994 1997-11-20 20:16:16 99995 1997-11-22 05:10:44 99996 1997-11-17 19:39:03 99997 1997-09-20 22:49:55 99998 1997-12-17 22:52:36 99999 1997-11-19 17:13:03 Name: timestamp, Length: 100000, dtype: datetime64[ns]
replacement_timestamps=pd.to_datetime(individual_ratings["timestamp"], unit='s')
Note that pd.to_datetime
converted each of the timestamps individual without us telling it manually to loop through them. Hooray vectorized functions!
individual_ratings["timestamp"]=replacement_timestamps
One = sign not two ( ==). Why?
individual_ratings
user_id | item_id | rating | timestamp | |
---|---|---|---|---|
0 | 196 | 242 | 3 | 1997-12-04 15:55:49 |
1 | 186 | 302 | 3 | 1998-04-04 19:22:22 |
2 | 22 | 377 | 1 | 1997-11-07 07:18:36 |
3 | 244 | 51 | 2 | 1997-11-27 05:02:03 |
4 | 166 | 346 | 1 | 1998-02-02 05:33:16 |
5 | 298 | 474 | 4 | 1998-01-07 14:20:06 |
6 | 115 | 265 | 2 | 1997-12-03 17:51:28 |
7 | 253 | 465 | 5 | 1998-04-03 18:34:27 |
8 | 305 | 451 | 3 | 1998-02-01 09:20:17 |
9 | 6 | 86 | 3 | 1997-12-31 21:16:53 |
10 | 62 | 257 | 2 | 1997-11-12 22:07:14 |
11 | 286 | 1014 | 5 | 1997-11-17 15:38:45 |
12 | 200 | 222 | 5 | 1997-10-05 09:05:40 |
13 | 210 | 40 | 3 | 1998-03-27 21:59:54 |
14 | 224 | 29 | 3 | 1998-02-21 23:40:57 |
15 | 303 | 785 | 3 | 1997-11-14 05:28:38 |
16 | 122 | 387 | 5 | 1997-11-11 17:47:39 |
17 | 194 | 274 | 2 | 1997-11-14 20:36:34 |
18 | 291 | 1042 | 4 | 1997-09-21 09:42:24 |
19 | 234 | 1184 | 2 | 1998-04-08 23:47:17 |
20 | 119 | 392 | 4 | 1998-01-30 16:13:34 |
21 | 167 | 486 | 4 | 1998-04-16 14:54:12 |
22 | 299 | 144 | 4 | 1997-10-26 15:55:20 |
23 | 291 | 118 | 2 | 1997-09-21 09:24:38 |
24 | 308 | 1 | 4 | 1998-02-17 17:28:52 |
25 | 95 | 546 | 2 | 1997-11-10 21:16:06 |
26 | 38 | 95 | 5 | 1998-04-13 01:14:54 |
27 | 102 | 768 | 2 | 1998-01-02 13:40:50 |
28 | 63 | 277 | 4 | 1997-10-01 23:10:01 |
29 | 160 | 234 | 5 | 1997-10-14 20:33:05 |
... | ... | ... | ... | ... |
99970 | 449 | 120 | 1 | 1997-11-19 17:12:53 |
99971 | 661 | 762 | 2 | 1997-10-05 07:38:41 |
99972 | 721 | 874 | 3 | 1997-10-18 01:17:27 |
99973 | 821 | 151 | 4 | 1997-09-20 22:01:29 |
99974 | 764 | 596 | 3 | 1997-10-07 16:50:46 |
99975 | 537 | 443 | 3 | 1998-01-28 23:55:52 |
99976 | 618 | 628 | 2 | 1998-03-31 01:33:39 |
99977 | 487 | 291 | 3 | 1997-12-30 01:24:39 |
99978 | 113 | 975 | 5 | 1997-10-04 03:40:24 |
99979 | 943 | 391 | 2 | 1998-02-28 04:31:31 |
99980 | 864 | 685 | 4 | 1998-03-03 02:25:00 |
99981 | 750 | 323 | 3 | 1997-11-13 18:31:17 |
99982 | 279 | 64 | 1 | 1997-09-26 21:15:10 |
99983 | 646 | 750 | 3 | 1998-02-26 21:35:02 |
99984 | 654 | 370 | 2 | 1998-02-19 04:51:54 |
99985 | 617 | 582 | 4 | 1998-01-03 01:01:34 |
99986 | 913 | 690 | 3 | 1997-11-29 17:24:48 |
99987 | 660 | 229 | 2 | 1998-04-01 04:50:12 |
99988 | 421 | 498 | 4 | 1998-04-10 20:49:04 |
99989 | 495 | 1091 | 4 | 1998-02-28 03:45:03 |
99990 | 806 | 421 | 4 | 1997-12-17 20:01:37 |
99991 | 676 | 538 | 4 | 1998-04-16 00:10:37 |
99992 | 721 | 262 | 3 | 1997-10-18 01:14:45 |
99993 | 913 | 209 | 2 | 1997-12-06 00:12:30 |
99994 | 378 | 78 | 3 | 1997-11-20 20:16:16 |
99995 | 880 | 476 | 3 | 1997-11-22 05:10:44 |
99996 | 716 | 204 | 5 | 1997-11-17 19:39:03 |
99997 | 276 | 1090 | 1 | 1997-09-20 22:49:55 |
99998 | 13 | 225 | 2 | 1997-12-17 22:52:36 |
99999 | 12 | 203 | 3 | 1997-11-19 17:13:03 |
100000 rows × 4 columns
Now, this is nice.
What if we wanted to get all the items that one user ranked?
Our new BFF boolean indexing comes to the rescue.
individual_ratings["user_id"]==42
0 False 1 False 2 False 3 False 4 False 5 False 6 False 7 False 8 False 9 False 10 False 11 False 12 False 13 False 14 False ... 99985 False 99986 False 99987 False 99988 False 99989 False 99990 False 99991 False 99992 False 99993 False 99994 False 99995 False 99996 False 99997 False 99998 False 99999 False Name: user_id, Length: 100000, dtype: bool
user_42_ratings_boolean=individual_ratings["user_id"]==42
individual_ratings[user_42_ratings_boolean]
user_id | item_id | rating | timestamp | |
---|---|---|---|---|
58 | 42 | 423 | 5 | 1997-12-03 00:08:07 |
87 | 42 | 403 | 3 | 1997-12-03 00:24:44 |
111 | 42 | 96 | 5 | 1997-12-02 23:59:38 |
166 | 42 | 794 | 3 | 1997-12-03 00:20:25 |
310 | 42 | 546 | 3 | 1997-12-02 23:36:57 |
638 | 42 | 274 | 5 | 1997-12-02 23:36:57 |
659 | 42 | 588 | 5 | 1997-12-03 00:15:47 |
754 | 42 | 44 | 3 | 1997-12-03 00:22:28 |
778 | 42 | 1028 | 4 | 1997-12-02 23:41:12 |
871 | 42 | 625 | 3 | 1997-12-03 00:27:53 |
1119 | 42 | 98 | 4 | 1997-12-02 23:51:51 |
1245 | 42 | 953 | 2 | 1997-12-03 00:26:55 |
1656 | 42 | 685 | 4 | 1997-12-02 23:39:32 |
1761 | 42 | 176 | 3 | 1997-12-02 23:59:38 |
1864 | 42 | 195 | 5 | 1997-12-03 00:12:29 |
2179 | 42 | 185 | 4 | 1997-12-03 00:04:09 |
2290 | 42 | 69 | 4 | 1997-12-03 00:02:55 |
2394 | 42 | 684 | 4 | 1997-12-03 00:14:53 |
2431 | 42 | 603 | 4 | 1997-12-03 00:05:02 |
2613 | 42 | 1041 | 4 | 1997-12-03 00:31:00 |
2809 | 42 | 121 | 4 | 1997-12-03 00:56:18 |
2833 | 42 | 606 | 3 | 1997-12-03 00:05:38 |
2863 | 42 | 456 | 3 | 1997-12-02 23:41:53 |
2979 | 42 | 506 | 3 | 1997-12-03 00:26:00 |
3060 | 42 | 143 | 4 | 1997-12-03 00:17:09 |
3162 | 42 | 746 | 3 | 1997-12-03 00:17:59 |
3480 | 42 | 48 | 5 | 1997-12-03 00:10:21 |
3542 | 42 | 999 | 4 | 1997-12-03 00:29:42 |
3601 | 42 | 102 | 5 | 1997-12-03 00:27:53 |
3824 | 42 | 210 | 5 | 1997-12-03 00:23:53 |
... | ... | ... | ... | ... |
59045 | 42 | 1046 | 3 | 1997-12-03 00:26:00 |
60647 | 42 | 97 | 3 | 1997-12-03 00:05:02 |
61040 | 42 | 559 | 2 | 1997-12-03 00:34:31 |
61695 | 42 | 86 | 3 | 1997-12-03 00:11:20 |
62662 | 42 | 71 | 4 | 1997-12-03 00:17:09 |
63521 | 42 | 941 | 4 | 1997-12-03 00:31:00 |
67740 | 42 | 655 | 3 | 1997-12-03 00:07:22 |
68778 | 42 | 969 | 5 | 1997-12-03 00:08:07 |
69604 | 42 | 132 | 5 | 1997-12-03 00:05:02 |
70257 | 42 | 595 | 1 | 1997-12-02 23:49:42 |
70653 | 42 | 1048 | 1 | 1997-12-02 23:43:40 |
71380 | 42 | 826 | 3 | 1997-12-02 23:46:59 |
73843 | 42 | 111 | 1 | 1997-12-02 23:38:51 |
74673 | 42 | 1050 | 3 | 1997-12-03 00:05:38 |
76940 | 42 | 141 | 3 | 1997-12-03 00:30:59 |
77201 | 42 | 181 | 5 | 1997-12-03 00:01:31 |
79562 | 42 | 174 | 5 | 1997-12-02 23:51:51 |
79923 | 42 | 73 | 4 | 1997-12-03 00:21:24 |
82241 | 42 | 168 | 3 | 1997-12-03 00:09:33 |
84817 | 42 | 2 | 5 | 1997-12-03 00:34:31 |
85776 | 42 | 658 | 2 | 1997-12-03 00:05:02 |
86538 | 42 | 755 | 4 | 1997-12-03 00:20:25 |
86768 | 42 | 282 | 4 | 1997-12-02 23:34:37 |
87394 | 42 | 136 | 4 | 1997-12-03 00:02:09 |
88397 | 42 | 735 | 4 | 1997-12-03 00:22:28 |
89527 | 42 | 411 | 4 | 1997-12-02 23:45:17 |
93817 | 42 | 433 | 2 | 1997-12-03 00:26:00 |
94791 | 42 | 87 | 4 | 1997-12-03 00:06:16 |
97557 | 42 | 591 | 4 | 1997-12-03 00:48:58 |
98433 | 42 | 103 | 3 | 1997-12-02 23:42:42 |
183 rows × 4 columns
Once we're in the confort zone with boolean indexing, we'd probably condense all that into one line:
individual_ratings[individual_ratings["user_id"]==42]
user_id | item_id | rating | timestamp | |
---|---|---|---|---|
58 | 42 | 423 | 5 | 1997-12-03 00:08:07 |
87 | 42 | 403 | 3 | 1997-12-03 00:24:44 |
111 | 42 | 96 | 5 | 1997-12-02 23:59:38 |
166 | 42 | 794 | 3 | 1997-12-03 00:20:25 |
310 | 42 | 546 | 3 | 1997-12-02 23:36:57 |
638 | 42 | 274 | 5 | 1997-12-02 23:36:57 |
659 | 42 | 588 | 5 | 1997-12-03 00:15:47 |
754 | 42 | 44 | 3 | 1997-12-03 00:22:28 |
778 | 42 | 1028 | 4 | 1997-12-02 23:41:12 |
871 | 42 | 625 | 3 | 1997-12-03 00:27:53 |
1119 | 42 | 98 | 4 | 1997-12-02 23:51:51 |
1245 | 42 | 953 | 2 | 1997-12-03 00:26:55 |
1656 | 42 | 685 | 4 | 1997-12-02 23:39:32 |
1761 | 42 | 176 | 3 | 1997-12-02 23:59:38 |
1864 | 42 | 195 | 5 | 1997-12-03 00:12:29 |
2179 | 42 | 185 | 4 | 1997-12-03 00:04:09 |
2290 | 42 | 69 | 4 | 1997-12-03 00:02:55 |
2394 | 42 | 684 | 4 | 1997-12-03 00:14:53 |
2431 | 42 | 603 | 4 | 1997-12-03 00:05:02 |
2613 | 42 | 1041 | 4 | 1997-12-03 00:31:00 |
2809 | 42 | 121 | 4 | 1997-12-03 00:56:18 |
2833 | 42 | 606 | 3 | 1997-12-03 00:05:38 |
2863 | 42 | 456 | 3 | 1997-12-02 23:41:53 |
2979 | 42 | 506 | 3 | 1997-12-03 00:26:00 |
3060 | 42 | 143 | 4 | 1997-12-03 00:17:09 |
3162 | 42 | 746 | 3 | 1997-12-03 00:17:59 |
3480 | 42 | 48 | 5 | 1997-12-03 00:10:21 |
3542 | 42 | 999 | 4 | 1997-12-03 00:29:42 |
3601 | 42 | 102 | 5 | 1997-12-03 00:27:53 |
3824 | 42 | 210 | 5 | 1997-12-03 00:23:53 |
... | ... | ... | ... | ... |
59045 | 42 | 1046 | 3 | 1997-12-03 00:26:00 |
60647 | 42 | 97 | 3 | 1997-12-03 00:05:02 |
61040 | 42 | 559 | 2 | 1997-12-03 00:34:31 |
61695 | 42 | 86 | 3 | 1997-12-03 00:11:20 |
62662 | 42 | 71 | 4 | 1997-12-03 00:17:09 |
63521 | 42 | 941 | 4 | 1997-12-03 00:31:00 |
67740 | 42 | 655 | 3 | 1997-12-03 00:07:22 |
68778 | 42 | 969 | 5 | 1997-12-03 00:08:07 |
69604 | 42 | 132 | 5 | 1997-12-03 00:05:02 |
70257 | 42 | 595 | 1 | 1997-12-02 23:49:42 |
70653 | 42 | 1048 | 1 | 1997-12-02 23:43:40 |
71380 | 42 | 826 | 3 | 1997-12-02 23:46:59 |
73843 | 42 | 111 | 1 | 1997-12-02 23:38:51 |
74673 | 42 | 1050 | 3 | 1997-12-03 00:05:38 |
76940 | 42 | 141 | 3 | 1997-12-03 00:30:59 |
77201 | 42 | 181 | 5 | 1997-12-03 00:01:31 |
79562 | 42 | 174 | 5 | 1997-12-02 23:51:51 |
79923 | 42 | 73 | 4 | 1997-12-03 00:21:24 |
82241 | 42 | 168 | 3 | 1997-12-03 00:09:33 |
84817 | 42 | 2 | 5 | 1997-12-03 00:34:31 |
85776 | 42 | 658 | 2 | 1997-12-03 00:05:02 |
86538 | 42 | 755 | 4 | 1997-12-03 00:20:25 |
86768 | 42 | 282 | 4 | 1997-12-02 23:34:37 |
87394 | 42 | 136 | 4 | 1997-12-03 00:02:09 |
88397 | 42 | 735 | 4 | 1997-12-03 00:22:28 |
89527 | 42 | 411 | 4 | 1997-12-02 23:45:17 |
93817 | 42 | 433 | 2 | 1997-12-03 00:26:00 |
94791 | 42 | 87 | 4 | 1997-12-03 00:06:16 |
97557 | 42 | 591 | 4 | 1997-12-03 00:48:58 |
98433 | 42 | 103 | 3 | 1997-12-02 23:42:42 |
183 rows × 4 columns
Now, if just wanted the series of ratings of user 42, we could add an index ['rating'].
individual_ratings[user_42_ratings_boolean]['rating']
58 5 87 3 111 5 166 3 310 3 638 5 659 5 754 3 778 4 871 3 1119 4 1245 2 1656 4 1761 3 1864 5 ... 77201 5 79562 5 79923 4 82241 3 84817 5 85776 2 86538 4 86768 4 87394 4 88397 4 89527 4 93817 2 94791 4 97557 4 98433 3 Name: rating, Length: 183, dtype: int64
#or in a one line formulation:
individual_ratings[individual_ratings["user_id"]==42]['rating']
58 5 87 3 111 5 166 3 310 3 638 5 659 5 754 3 778 4 871 3 1119 4 1245 2 1656 4 1761 3 1864 5 ... 77201 5 79562 5 79923 4 82241 3 84817 5 85776 2 86538 4 86768 4 87394 4 88397 4 89527 4 93817 2 94791 4 97557 4 98433 3 Name: rating, Length: 183, dtype: int64
pandas
lets us do all sorts of simple statistics, like finding the mean. just tack on the method mean
.
individual_ratings[individual_ratings["user_id"]==42]['rating'].mean()
3.7267759562841531
How about all the ratings for a given film, say no. 65? How would we get that?
individual_ratings[individual_ratings["item_id"]==65]
user_id | item_id | rating | timestamp | |
---|---|---|---|---|
247 | 62 | 65 | 4 | 1997-11-12 22:44:46 |
1042 | 271 | 65 | 3 | 1998-01-26 21:16:59 |
1152 | 207 | 65 | 3 | 1997-10-29 05:56:34 |
2321 | 303 | 65 | 4 | 1997-11-14 00:30:36 |
2608 | 279 | 65 | 1 | 1997-09-26 20:46:07 |
3111 | 313 | 65 | 2 | 1998-03-27 16:42:42 |
7149 | 59 | 65 | 4 | 1998-02-23 03:41:05 |
9097 | 378 | 65 | 3 | 1997-11-20 17:15:32 |
9178 | 151 | 65 | 4 | 1997-11-14 17:32:09 |
10285 | 128 | 65 | 4 | 1997-11-19 19:41:52 |
11112 | 210 | 65 | 4 | 1998-02-17 16:01:45 |
11591 | 347 | 65 | 2 | 1997-12-09 08:04:39 |
11779 | 339 | 65 | 4 | 1998-03-27 21:17:32 |
13254 | 409 | 65 | 4 | 1997-12-03 00:26:17 |
13860 | 116 | 65 | 2 | 1997-10-10 03:27:32 |
14614 | 144 | 65 | 4 | 1998-02-22 00:09:42 |
16207 | 235 | 65 | 2 | 1998-03-11 22:35:23 |
16330 | 198 | 65 | 2 | 1998-01-07 21:24:01 |
16707 | 71 | 65 | 5 | 1998-01-17 06:02:41 |
17220 | 1 | 65 | 4 | 1997-09-24 03:35:25 |
19110 | 401 | 65 | 4 | 1998-03-27 21:14:10 |
19153 | 398 | 65 | 3 | 1997-10-01 22:08:59 |
20515 | 437 | 65 | 4 | 1997-11-21 19:33:07 |
20831 | 65 | 65 | 3 | 1997-11-11 02:51:12 |
21607 | 18 | 65 | 5 | 1997-11-21 16:38:53 |
21786 | 267 | 65 | 4 | 1997-11-08 06:54:31 |
23247 | 450 | 65 | 3 | 1997-12-17 16:41:25 |
26808 | 239 | 65 | 5 | 1998-03-06 10:27:21 |
29009 | 187 | 65 | 5 | 1997-11-13 23:58:27 |
30379 | 417 | 65 | 4 | 1997-11-16 02:23:31 |
... | ... | ... | ... | ... |
68157 | 621 | 65 | 3 | 1998-01-23 23:09:04 |
69155 | 790 | 65 | 4 | 1998-01-18 20:37:26 |
69366 | 916 | 65 | 3 | 1997-11-29 23:15:27 |
69838 | 405 | 65 | 1 | 1998-01-23 09:06:19 |
71118 | 276 | 65 | 4 | 1997-09-20 20:31:07 |
72450 | 815 | 65 | 5 | 1997-11-05 01:51:04 |
73577 | 848 | 65 | 2 | 1998-02-09 15:35:27 |
73753 | 883 | 65 | 4 | 1998-04-04 19:15:19 |
74031 | 269 | 65 | 4 | 1998-04-01 16:27:52 |
74869 | 174 | 65 | 5 | 1998-02-03 13:55:23 |
77183 | 354 | 65 | 4 | 1998-03-30 00:34:06 |
79753 | 727 | 65 | 2 | 1998-01-02 03:39:03 |
80688 | 870 | 65 | 3 | 1997-11-16 20:58:18 |
80856 | 216 | 65 | 4 | 1997-11-22 21:25:39 |
81409 | 468 | 65 | 3 | 1997-09-26 17:22:29 |
81865 | 864 | 65 | 3 | 1998-03-03 02:04:50 |
82834 | 244 | 65 | 4 | 1997-11-27 04:42:46 |
83681 | 934 | 65 | 4 | 1998-03-29 17:35:14 |
84507 | 601 | 65 | 4 | 1997-10-08 22:33:37 |
86661 | 846 | 65 | 3 | 1998-01-04 21:27:34 |
87592 | 887 | 65 | 5 | 1997-12-06 04:14:39 |
88365 | 805 | 65 | 3 | 1997-12-09 20:21:01 |
88946 | 766 | 65 | 4 | 1998-03-31 02:03:30 |
89960 | 897 | 65 | 4 | 1997-11-20 02:26:51 |
90575 | 709 | 65 | 2 | 1997-11-18 09:54:28 |
93337 | 788 | 65 | 4 | 1997-11-30 05:59:44 |
95905 | 886 | 65 | 3 | 1997-10-05 06:11:10 |
96697 | 682 | 65 | 3 | 1998-02-26 18:23:36 |
96833 | 868 | 65 | 2 | 1997-10-17 16:03:32 |
99541 | 92 | 65 | 4 | 1997-09-30 21:12:40 |
115 rows × 4 columns
individual_ratings[individual_ratings["item_id"]==65].mean()
user_id 457.852174 item_id 65.000000 rating 3.539130 dtype: float64
Hmmm.....why is this output different?
Now, you're probably thinking, "there's just no way pandas
can't automate this!"
for i in range(20):
mean=individual_ratings[individual_ratings["item_id"]==i]['rating'].mean()
if mean < 3.7:
comment = "the people have spoken"
else:
comment = "a possibility, dear"
print str(i)+"\t"+str(mean)+"\t\t"+comment
0 nan a possibility, dear 1 3.87831858407 a possibility, dear 2 3.20610687023 the people have spoken 3 3.03333333333 the people have spoken 4 3.55023923445 the people have spoken 5 3.3023255814 the people have spoken 6 3.57692307692 the people have spoken 7 3.79846938776 a possibility, dear 8 3.99543378995 a possibility, dear 9 3.89632107023 a possibility, dear 10 3.83146067416 a possibility, dear 11 3.84745762712 a possibility, dear 12 4.38576779026 a possibility, dear 13 3.41847826087 the people have spoken 14 3.96721311475 a possibility, dear 15 3.77815699659 a possibility, dear 16 3.20512820513 the people have spoken 17 3.11956521739 the people have spoken 18 2.8 the people have spoken 19 3.95652173913 a possibility, dear
That's what I promised you you wouldn't need to do.
The hard part is to pick among them!
Profoundly badass is the groupby
method. As its name suggests, it takes a series or dataframe and groups the data by a column of your choosing. You then perform a function on each group.
individual_ratings.groupby(by="item_id").mean()
user_id | rating | |
---|---|---|
item_id | ||
1 | 477.011062 | 3.878319 |
2 | 492.007634 | 3.206107 |
3 | 459.133333 | 3.033333 |
4 | 469.497608 | 3.550239 |
5 | 439.372093 | 3.302326 |
6 | 454.576923 | 3.576923 |
7 | 445.369898 | 3.798469 |
8 | 454.675799 | 3.995434 |
9 | 460.321070 | 3.896321 |
10 | 450.213483 | 3.831461 |
11 | 440.762712 | 3.847458 |
12 | 448.382022 | 4.385768 |
13 | 436.668478 | 3.418478 |
14 | 458.836066 | 3.967213 |
15 | 459.525597 | 3.778157 |
16 | 503.692308 | 3.205128 |
17 | 441.489130 | 3.119565 |
18 | 219.200000 | 2.800000 |
19 | 489.376812 | 3.956522 |
20 | 478.916667 | 3.416667 |
21 | 450.821429 | 2.761905 |
22 | 471.000000 | 4.151515 |
23 | 466.203297 | 4.120879 |
24 | 458.477011 | 3.448276 |
25 | 449.901024 | 3.443686 |
26 | 472.945205 | 3.452055 |
27 | 467.508772 | 3.105263 |
28 | 465.710145 | 3.931159 |
29 | 466.859649 | 2.666667 |
30 | 483.945946 | 3.945946 |
... | ... | ... |
1653 | 675.000000 | 5.000000 |
1654 | 676.000000 | 1.000000 |
1655 | 682.000000 | 2.000000 |
1656 | 798.000000 | 3.500000 |
1657 | 727.000000 | 3.000000 |
1658 | 803.000000 | 3.000000 |
1659 | 747.000000 | 1.000000 |
1660 | 747.000000 | 2.000000 |
1661 | 751.000000 | 1.000000 |
1662 | 772.000000 | 2.500000 |
1663 | 782.000000 | 2.000000 |
1664 | 842.750000 | 3.250000 |
1665 | 782.000000 | 2.000000 |
1666 | 782.000000 | 2.000000 |
1667 | 782.000000 | 3.000000 |
1668 | 782.000000 | 3.000000 |
1669 | 782.000000 | 2.000000 |
1670 | 782.000000 | 3.000000 |
1671 | 787.000000 | 1.000000 |
1672 | 862.000000 | 2.000000 |
1673 | 835.000000 | 3.000000 |
1674 | 840.000000 | 4.000000 |
1675 | 851.000000 | 3.000000 |
1676 | 851.000000 | 2.000000 |
1677 | 854.000000 | 3.000000 |
1678 | 863.000000 | 1.000000 |
1679 | 863.000000 | 3.000000 |
1680 | 863.000000 | 2.000000 |
1681 | 896.000000 | 3.000000 |
1682 | 916.000000 | 3.000000 |
1682 rows × 2 columns
Pivot
¶What if we wanted to have a big table where each row is the user followed by all her ratings? We could write a few lines of code to produce this.
What would such code look like?
Fortunately, Pandas will do this heavy lifting for us using the pivot
method.
ratings=individual_ratings.pivot(index="user_id", columns="item_id", values="rating")
Basically: rework our data using user_id as row names; item_id as column names and all the ratings as the values
ratings[100:115]
item_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
101 | 3 | NaN | NaN | NaN | NaN | NaN | 3 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
102 | 3 | 2 | NaN | 2 | 3 | NaN | 2 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
103 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
104 | NaN | NaN | 3 | NaN | NaN | NaN | 3 | NaN | 2 | 2 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
105 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
106 | 4 | NaN | NaN | NaN | NaN | NaN | NaN | 4 | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
107 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
108 | 4 | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
109 | 4 | NaN | NaN | 2 | 3 | NaN | 4 | 3 | 3 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
110 | NaN | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
111 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
112 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
113 | NaN | NaN | NaN | NaN | NaN | NaN | 3 | NaN | 3 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
114 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
115 | NaN | NaN | NaN | 4 | NaN | NaN | 5 | 5 | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
15 rows × 1682 columns
In the biz, this is called a sparse matrix. Sparse matrixes are the heart of all data mining of consumers--Amazon ranking, Netflix recommendations--and lots of search technologies--Google, etc.
Pandas lets us easily compute standard statistics across columns, rows and so forth.
The commands require us to refer to the columns and rows by their respective 'axis' number:
0 for going DOWN a column--so the ratings given by ALL users to a ONE film
1 for going ACROSS a row--so the ratings given by ONE user to ALL the films
(There is only Axis, no Allies).
Let's start looking into the ratings. We can use the mean
method on a dataframe
type. We need to say which direction we mean to mean.
ratings.mean(axis=0) #average rating per film (axis 0)
item_id 1 3.878319 2 3.206107 3 3.033333 4 3.550239 5 3.302326 6 3.576923 7 3.798469 8 3.995434 9 3.896321 10 3.831461 11 3.847458 12 4.385768 13 3.418478 14 3.967213 15 3.778157 ... 1668 3 1669 2 1670 3 1671 1 1672 2 1673 3 1674 4 1675 3 1676 2 1677 3 1678 1 1679 3 1680 2 1681 3 1682 3 Length: 1682, dtype: float64
ratings.mean(1) #we can drop the axis= bit if we want
user_id 1 3.610294 2 3.709677 3 2.796296 4 4.333333 5 2.874286 6 3.635071 7 3.965261 8 3.796610 9 4.272727 10 4.206522 11 3.464088 12 4.392157 13 3.097484 14 4.091837 15 2.875000 ... 929 3.693878 930 2.968254 931 3.721311 932 3.966805 933 2.646739 934 3.701149 935 3.923077 936 3.746479 937 3.375000 938 3.268519 939 4.265306 940 3.457944 941 4.045455 942 4.265823 943 3.410714 Length: 943, dtype: float64
What are the top ranked films? The .order()
method will order our series by values.
ratings.mean(0).order()
item_id 1659 0.75 1564 1.00 1364 1.00 1587 1.00 439 1.00 1586 1.00 858 1.00 1366 1.00 437 1.00 852 1.00 1584 1.00 1373 1.00 1349 1.00 1583 1.00 1348 1.00 ... 64 4.282686 169 4.290254 408 4.354911 119 4.500000 1398 4.500000 1642 4.500000 1293 4.583333 1189 4.583333 1449 4.625000 1599 5.000000 1536 5.000000 814 5.000000 1500 5.000000 1467 5.000000 1653 5.000000 Length: 1682, dtype: float64
We might want to disregard movies with a low number of ratings. We need to know how many each film got.
The count
method will tell us how many non NaN values there are, so we can know if there are lots of ratings, or only a few.
How many users have rated each film:
ratings.count(0)
item_id 1 452 2 131 3 90 4 209 5 86 6 26 7 392 8 219 9 299 10 89 11 236 12 267 13 184 14 183 15 293 ... 1668 1 1669 1 1670 1 1671 1 1672 2 1673 1 1674 1 1675 1 1676 1 1677 1 1678 1 1679 1 1680 1 1681 1 1682 1 Length: 1682, dtype: int64
How many films every user has rated:
ratings.count(1)
user_id 1 272 2 62 3 54 4 24 5 175 6 211 7 403 8 59 9 22 10 184 11 181 12 51 13 636 14 98 15 104 ... 929 49 930 63 931 61 932 241 933 184 934 174 935 39 936 142 937 40 938 108 939 49 940 107 941 22 942 79 943 168 Length: 943, dtype: int64
The method describe
computes a variety of standard statistics for the items.
ratings.describe()
/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py:3549: FutureWarning: The `percentile_width` keyword is deprecated. Use percentiles=[0.25, 0.5, 0.75] instead warnings.warn(msg, FutureWarning)
item_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 452.000000 | 131.000000 | 90.000000 | 209.000000 | 86.000000 | 26.000000 | 392.000000 | 219.000000 | 299.000000 | 89.000000 | ... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
mean | 3.878319 | 3.206107 | 3.033333 | 3.550239 | 3.302326 | 3.576923 | 3.798469 | 3.995434 | 3.896321 | 3.831461 | ... | 3 | 4 | 3 | 2 | 3 | 1 | 3 | 2 | 3 | 3 |
std | 0.927897 | 0.966497 | 1.212760 | 0.965069 | 0.946446 | 1.301478 | 0.982037 | 1.002281 | 1.042368 | 1.013948 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
min | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | ... | 3 | 4 | 3 | 2 | 3 | 1 | 3 | 2 | 3 | 3 |
25% | 3.000000 | 3.000000 | 2.000000 | 3.000000 | 3.000000 | 3.000000 | 3.000000 | 3.000000 | 3.000000 | 3.000000 | ... | 3 | 4 | 3 | 2 | 3 | 1 | 3 | 2 | 3 | 3 |
50% | 4.000000 | 3.000000 | 3.000000 | 4.000000 | 3.000000 | 4.000000 | 4.000000 | 4.000000 | 4.000000 | 4.000000 | ... | 3 | 4 | 3 | 2 | 3 | 1 | 3 | 2 | 3 | 3 |
75% | 5.000000 | 4.000000 | 4.000000 | 4.000000 | 4.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | ... | 3 | 4 | 3 | 2 | 3 | 1 | 3 | 2 | 3 | 3 |
max | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | ... | 3 | 4 | 3 | 2 | 3 | 1 | 3 | 2 | 3 | 3 |
8 rows × 1682 columns
Back to the ratings... what doesn't suck?
How can use use boolean indexing to find what doesn't suck according to the masses?
ratings.mean(0)>4.25
item_id 1 False 2 False 3 False 4 False 5 False 6 False 7 False 8 False 9 False 10 False 11 False 12 True 13 False 14 False 15 False ... 1668 False 1669 False 1670 False 1671 False 1672 False 1673 False 1674 False 1675 False 1676 False 1677 False 1678 False 1679 False 1680 False 1681 False 1682 False Length: 1682, dtype: bool
the_good_stuff=ratings.mean(0)>4.25
And if we want a dataframe of just the good stuff?
ratings[the_good_stuff]
item_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
12 | NaN | NaN | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
50 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
64 | 4 | 3 | NaN | 3 | NaN | NaN | 4 | 4 | 4 | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
98 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
114 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
119 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
127 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
134 | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
169 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
174 | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
178 | 4 | 4 | NaN | NaN | NaN | NaN | 4 | 4 | 2 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
251 | 4 | NaN | NaN | NaN | NaN | NaN | 3 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
272 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
285 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
318 | NaN | NaN | NaN | 2 | NaN | NaN | NaN | 4 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
357 | 5 | NaN | NaN | NaN | NaN | NaN | 3 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
408 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
427 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
474 | NaN | NaN | NaN | 5 | NaN | NaN | 5 | 5 | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
479 | 5 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
480 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
483 | 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
513 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
603 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
657 | 3 | NaN | NaN | NaN | NaN | NaN | 3 | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
814 | NaN | NaN | NaN | NaN | 3 | NaN | 4 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
26 rows × 1682 columns
We want to use boolean indexing across the columns but clever pandas
has done it on the rows. Good thing we checked.
We can use a more precise way of indexing a dataframe, the .loc
method, which takes .loc[rows,columns].
ratings.loc[:,the_good_stuff]
item_id | 12 | 50 | 64 | 98 | 114 | 119 | 127 | 134 | 169 | 174 | ... | 1398 | 1449 | 1467 | 1500 | 1536 | 1594 | 1599 | 1639 | 1642 | 1653 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
1 | 5 | 5 | 5 | 4 | 5 | 5 | 5 | 4 | 5 | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | NaN | 5 | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 | NaN | 4 | NaN | 3 | NaN | NaN | NaN | NaN | 5 | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
6 | 4 | 4 | 4 | 5 | NaN | NaN | 5 | 5 | 4 | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
7 | 5 | 5 | 5 | 4 | NaN | NaN | 5 | 4 | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
8 | NaN | 5 | NaN | NaN | NaN | NaN | 5 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
9 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
10 | 5 | 5 | 4 | 4 | NaN | NaN | 5 | 5 | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
11 | 2 | NaN | NaN | 2 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
12 | NaN | 4 | NaN | 5 | NaN | NaN | 4 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
13 | 5 | 5 | 5 | 4 | NaN | NaN | 5 | NaN | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
14 | 5 | 5 | NaN | 3 | NaN | NaN | 2 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
15 | NaN | 5 | NaN | NaN | NaN | NaN | 2 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
16 | 5 | NaN | 5 | 5 | NaN | NaN | 5 | 4 | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
17 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
18 | 5 | 4 | 5 | 5 | NaN | NaN | 5 | 5 | 5 | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
19 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
20 | NaN | 3 | NaN | 3 | NaN | NaN | NaN | NaN | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
21 | NaN | 3 | NaN | 5 | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
22 | NaN | 5 | NaN | NaN | NaN | NaN | 5 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
23 | NaN | 4 | NaN | 5 | NaN | NaN | NaN | 4 | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
24 | 5 | NaN | 5 | 5 | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25 | NaN | 5 | NaN | 5 | 5 | NaN | 3 | 4 | 5 | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
26 | NaN | 4 | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
27 | NaN | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
28 | 4 | 4 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
29 | 5 | NaN | NaN | 4 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
30 | NaN | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
914 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
915 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
916 | 4 | 5 | 5 | 5 | NaN | NaN | NaN | 5 | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
917 | NaN | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
918 | NaN | NaN | 4 | NaN | NaN | NaN | NaN | NaN | NaN | 3 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN |
919 | 3 | 3 | 5 | 5 | NaN | NaN | NaN | NaN | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
920 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
921 | NaN | 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
922 | NaN | 5 | NaN | 5 | NaN | NaN | 3 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
923 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
924 | 4 | 5 | 4 | NaN | 3 | NaN | 3 | 4 | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
925 | NaN | NaN | NaN | 4 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
926 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
927 | NaN | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | 3 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
928 | NaN | NaN | NaN | 5 | 5 | NaN | 5 | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
929 | 4 | 4 | NaN | 5 | NaN | NaN | 5 | 4 | NaN | 3 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
930 | NaN | 2 | 4 | NaN | NaN | NaN | NaN | NaN | NaN | 3 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
931 | NaN | 3 | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
932 | NaN | NaN | 2 | 5 | 5 | 5 | NaN | 4 | 5 | 4 | ... | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
933 | 4 | 4 | 5 | 5 | NaN | NaN | 5 | NaN | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
934 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | 4 | NaN | 5 | ... | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
935 | NaN | NaN | NaN | NaN | NaN | NaN | 4 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
936 | NaN | 4 | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
937 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
938 | NaN | 5 | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
939 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
940 | 4 | 4 | NaN | 4 | NaN | NaN | NaN | NaN | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
941 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
942 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
943 | 5 | 4 | 5 | 5 | NaN | NaN | 5 | NaN | NaN | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
943 rows × 42 columns
Cool! What are the average ratings per user?
We need to use mean
across columns.
ratings.mean(1) #average rating per user axis 1 is rows--user ids
user_id 1 3.610294 2 3.709677 3 2.796296 4 4.333333 5 2.874286 6 3.635071 7 3.965261 8 3.796610 9 4.272727 10 4.206522 11 3.464088 12 4.392157 13 3.097484 14 4.091837 15 2.875000 ... 929 3.693878 930 2.968254 931 3.721311 932 3.966805 933 2.646739 934 3.701149 935 3.923077 936 3.746479 937 3.375000 938 3.268519 939 4.265306 940 3.457944 941 4.045455 942 4.265823 943 3.410714 Length: 943, dtype: float64
ratings.mean(1)>4 # axis 1 is rows--user ids
user_id 1 False 2 False 3 False 4 True 5 False 6 False 7 False 8 False 9 True 10 True 11 False 12 True 13 False 14 True 15 False ... 929 False 930 False 931 False 932 False 933 False 934 False 935 False 936 False 937 False 938 False 939 True 940 False 941 True 942 True 943 False Length: 943, dtype: bool
those_lacking_discernment=ratings.mean(1)>4
ratings[those_lacking_discernment]
item_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
9 | NaN | NaN | NaN | NaN | NaN | 5 | 4 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
10 | 4 | NaN | NaN | 4 | NaN | NaN | 4 | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
12 | NaN | NaN | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
14 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
16 | 5 | NaN | NaN | 5 | NaN | NaN | 5 | 5 | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
24 | NaN | NaN | NaN | NaN | NaN | NaN | 4 | 5 | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25 | 5 | NaN | NaN | NaN | NaN | NaN | 4 | 4 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
34 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
46 | NaN | NaN | NaN | NaN | NaN | NaN | 4 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
52 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
60 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | 3 | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
89 | 5 | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
90 | NaN | NaN | NaN | NaN | NaN | 4 | NaN | 5 | 4 | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
96 | 5 | NaN | NaN | NaN | NaN | NaN | 5 | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
97 | 4 | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
118 | NaN | NaN | NaN | NaN | 2 | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
127 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
131 | 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
136 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
137 | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
138 | 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
147 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
152 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
164 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
173 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
185 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
187 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
200 | 5 | 4 | NaN | NaN | NaN | NaN | 4 | 4 | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
210 | 5 | NaN | NaN | 4 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
770 | 5 | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
777 | 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
794 | 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
801 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
808 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
810 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
811 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
819 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
821 | 5 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
823 | 4 | NaN | NaN | 5 | NaN | NaN | 5 | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
835 | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
838 | 5 | NaN | NaN | NaN | NaN | NaN | 5 | 4 | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
840 | NaN | NaN | NaN | NaN | NaN | NaN | 4 | 5 | NaN | NaN | ... | NaN | 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
848 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
849 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
850 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
862 | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | NaN | 5 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
867 | 4 | NaN | NaN | NaN | NaN | NaN | 5 | NaN | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
875 | NaN | NaN | NaN | 3 | NaN | NaN | NaN | 3 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
876 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
882 | 5 | NaN | NaN | 4 | NaN | NaN | 4 | 5 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
888 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
891 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
907 | 5 | NaN | NaN | NaN | 5 | NaN | NaN | 3 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
909 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
923 | 3 | NaN | 4 | NaN | NaN | NaN | NaN | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
928 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
939 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
941 | 5 | NaN | NaN | NaN | NaN | NaN | 4 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
942 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
147 rows × 1682 columns
Could you create a new ratings dataframe excluding all those lacking discernment, i.e. excluding people who have a mean rating > 4? It's on the home work!
What might we want to do with our new knowledge
Let's discount the less discerning viewers! Let's just lower their rankings by .75. A bit arbitrary, but so are they!
We can multiply every element in a dataframe by a constant like so:
ratings[those_lacking_discernment]*.75
item_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
9 | NaN | NaN | NaN | NaN | NaN | 3.75 | 3.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
10 | 3.00 | NaN | NaN | 3.00 | NaN | NaN | 3.00 | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
12 | NaN | NaN | NaN | 3.75 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
14 | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
16 | 3.75 | NaN | NaN | 3.75 | NaN | NaN | 3.75 | 3.75 | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
24 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | 3.75 | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.00 | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
34 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
46 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
52 | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
60 | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | 2.25 | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
89 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
90 | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | 3.75 | 3.00 | 3.75 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
96 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.75 | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
97 | 3.00 | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
118 | NaN | NaN | NaN | NaN | 1.50 | NaN | 3.75 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
127 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
131 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
136 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
137 | 2.25 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
138 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
147 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
152 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
164 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
173 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
185 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
187 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
200 | 3.75 | 3 | NaN | NaN | NaN | NaN | 3.00 | 3.00 | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
210 | 3.75 | NaN | NaN | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
770 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
777 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
794 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
801 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
808 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
810 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
811 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
819 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
821 | 3.75 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
823 | 3.00 | NaN | NaN | 3.75 | NaN | NaN | 3.75 | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
835 | 2.25 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | 2.25 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
838 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.75 | 3.00 | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
840 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | 3.75 | NaN | NaN | ... | NaN | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
848 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
849 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
850 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
862 | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | NaN | 3.75 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
867 | 3.00 | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
875 | NaN | NaN | NaN | 2.25 | NaN | NaN | NaN | 2.25 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
876 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
882 | 3.75 | NaN | NaN | 3.00 | NaN | NaN | 3.00 | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
888 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
891 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
907 | 3.75 | NaN | NaN | NaN | 3.75 | NaN | NaN | 2.25 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
909 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
923 | 2.25 | NaN | 3 | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
928 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
939 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
941 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
942 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
147 rows × 1682 columns
adjusted_ratings[those_lacking_discernment]=ratings[those_lacking_discernment]*.75
A lot of the movies lack very many ratings. Let's exclude them for now. We can tell how many ratings each column has with the .count
method.
ratings.count()
item_id 1 452 2 131 3 90 4 209 5 86 6 26 7 392 8 219 9 299 10 89 11 236 12 267 13 184 14 183 15 293 ... 1668 1 1669 1 1670 1 1671 1 1672 2 1673 1 1674 1 1675 1 1676 1 1677 1 1678 1 1679 1 1680 1 1681 1 1682 1 Length: 1682, dtype: int64
ratings.count()>10
item_id 1 True 2 True 3 True 4 True 5 True 6 True 7 True 8 True 9 True 10 True 11 True 12 True 13 True 14 True 15 True ... 1668 False 1669 False 1670 False 1671 False 1672 False 1673 False 1674 False 1675 False 1676 False 1677 False 1678 False 1679 False 1680 False 1681 False 1682 False Length: 1682, dtype: bool
We can use this index to produce a new dataframe of only the often rated movies.
ratings.loc[:,(ratings.count()>10)]
item_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 1421 | 1428 | 1444 | 1446 | 1451 | 1469 | 1478 | 1480 | 1483 | 1518 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
1 | 5.00 | 3 | 4 | 3.00 | 3 | 5.00 | 4.00 | 1.00 | 5.00 | 3 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 4.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 | 4.00 | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
6 | 4.00 | NaN | NaN | NaN | NaN | NaN | 2.00 | 4.00 | 4.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
7 | NaN | NaN | NaN | 5.00 | NaN | NaN | 5.00 | 5.00 | 5.00 | 4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
8 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
9 | NaN | NaN | NaN | NaN | NaN | 3.75 | 3.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
10 | 3.00 | NaN | NaN | 3.00 | NaN | NaN | 3.00 | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
11 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4.00 | 5.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
12 | NaN | NaN | NaN | 3.75 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
13 | 3.00 | 3 | NaN | 5.00 | 1 | NaN | 2.00 | 4.00 | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
14 | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
15 | 1.00 | NaN | NaN | NaN | NaN | NaN | 1.00 | NaN | 4.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
16 | 3.75 | NaN | NaN | 3.75 | NaN | NaN | 3.75 | 3.75 | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
17 | 4.00 | NaN | NaN | NaN | NaN | NaN | 4.00 | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
18 | 5.00 | NaN | NaN | 3.00 | NaN | 5.00 | NaN | 5.00 | 5.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
19 | NaN | NaN | NaN | 4.00 | NaN | NaN | NaN | 5.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
20 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
21 | 5.00 | NaN | NaN | NaN | 2 | NaN | 5.00 | NaN | 5.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
22 | NaN | 2 | NaN | 5.00 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
23 | 5.00 | NaN | NaN | NaN | NaN | NaN | 4.00 | 4.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
24 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | 3.75 | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.00 | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
26 | 3.00 | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | 4.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
27 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 4.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
28 | NaN | NaN | NaN | NaN | 3 | NaN | 5.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
29 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
30 | NaN | 3 | NaN | NaN | NaN | NaN | 4.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
914 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
915 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
916 | 4.00 | 3 | 3 | 4.00 | 3 | NaN | 4.00 | NaN | 5.00 | NaN | ... | NaN | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
917 | 3.00 | NaN | 1 | NaN | NaN | NaN | NaN | NaN | 5.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
918 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
919 | 4.00 | NaN | NaN | 1.00 | 4 | NaN | 3.00 | NaN | 5.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
920 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
921 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
922 | 5.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
923 | 2.25 | NaN | 3 | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
924 | 5.00 | 3 | NaN | NaN | NaN | 4.00 | 4.00 | NaN | 4.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | 4 | NaN | NaN | NaN |
925 | NaN | NaN | NaN | NaN | 4 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
926 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
927 | 5.00 | NaN | NaN | NaN | NaN | NaN | 3.00 | 4.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
928 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
929 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
930 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
931 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
932 | 4.00 | NaN | NaN | NaN | NaN | NaN | 4.00 | NaN | 5.00 | NaN | ... | NaN | NaN | NaN | NaN | 5 | NaN | NaN | NaN | NaN | NaN |
933 | 3.00 | NaN | NaN | 3.00 | NaN | NaN | 4.00 | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
934 | 2.00 | 4 | NaN | 5.00 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
935 | 3.00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
936 | 4.00 | NaN | 4 | NaN | NaN | 5.00 | 4.00 | NaN | 4.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
937 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 5.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
938 | 4.00 | NaN | NaN | NaN | NaN | NaN | 4.00 | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
939 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
940 | NaN | NaN | NaN | 2.00 | NaN | NaN | 4.00 | 5.00 | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
941 | 3.75 | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
942 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
943 | NaN | 5 | NaN | NaN | NaN | NaN | NaN | NaN | 3.00 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
943 rows × 1119 columns
ratings_lots=ratings.loc[:,(ratings.count()>10)]
ratings_lots.mean(0).order(ascending=False)
item_id 408 4.354911 169 4.290254 64 4.282686 318 4.280201 114 4.246269 483 4.241770 12 4.222846 50 4.192967 272 4.146465 963 4.146341 178 4.146000 251 4.130435 603 4.130383 127 4.121671 313 4.109286 ... 453 1.843750 976 1.833333 1230 1.833333 103 1.833333 894 1.828947 1254 1.818182 688 1.806818 545 1.791667 457 1.740741 901 1.729167 1274 1.727273 440 1.642857 669 1.615385 758 1.607143 424 1.276316 Length: 1119, dtype: float64
topten=ratings_lots.mean(0).order(ascending=False)[0:9].index
topten
Int64Index([408, 169, 64, 318, 114, 483, 12, 50, 272], dtype='int64')
elcrapo=ratings_lots.mean(0).order(ascending=True)[0:9].index
elcrapo
Int64Index([424, 758, 669, 440, 1274, 901, 457, 545, 688], dtype='int64')
The method var
calculates variance, which is a measure of how wide spread a set of numbers is from a mean. A value of zero indicates all the values are at the mean: higher numbers indicate more variation.
So, higher variance mean greater disagrement!
ratings_lots.var(0)
item_id 1 0.814642 2 0.880725 3 1.413241 4 0.909818 5 0.808618 6 1.612404 7 0.920142 8 0.977381 9 1.023329 10 0.879836 11 1.118584 12 0.717540 13 1.035814 14 0.972190 15 0.897890 ... 1401 1.184845 1404 1.443910 1407 0.644079 1411 1.213211 1419 0.801823 1421 1.290909 1428 0.628788 1444 0.794225 1446 1.066667 1451 0.539881 1469 1.356061 1478 1.035948 1480 1.018182 1483 1.151515 1518 0.774148 Length: 1119, dtype: float64
ratings_lots.var(0).order(ascending=True)[0:4]
item_id 1124 0.272727 608 0.290876 424 0.339547 587 0.369849 dtype: float64
agreement=ratings_lots.var(0).order(ascending=True)[0:4].index
ratings_lots.var(0).order(ascending=False)[0:4]
item_id 854 2.743490 853 2.381868 1085 2.290909 1001 2.034926 dtype: float64
disagreement=ratings_lots.var(0).order(ascending=False)[0:4].index
By ploting histograms, we can get a sense of the spread of their ratings.
ratings[agreement].hist()
array([[<matplotlib.axes.AxesSubplot object at 0x7f3148ff2890>, <matplotlib.axes.AxesSubplot object at 0x7f31498dddd0>], [<matplotlib.axes.AxesSubplot object at 0x7f314a20b410>, <matplotlib.axes.AxesSubplot object at 0x7f314ab32510>]], dtype=object)
ratings[disagreement].hist()
array([[<matplotlib.axes.AxesSubplot object at 0x7f314adc2550>, <matplotlib.axes.AxesSubplot object at 0x7f314911a3d0>], [<matplotlib.axes.AxesSubplot object at 0x7f3148dd2290>, <matplotlib.axes.AxesSubplot object at 0x7f314a622d50>]], dtype=object)
labels_films=["movie_id", "movie_title", "release_date", "video_release_date", "IMDb_URL", "unknown", "Action","Adventure", "Animation", "Children's", "Comedy", "Crime", "Documentary", "Drama", "Fantasy", "Film-Noir", "Horror", "Musical", "Mystery", "Romance", "Sci-Fi", "Thriller", "War", "Western"]
films=pd.read_csv( './ml-100k/u.item', sep="|", names=labels_films, index_col='movie_id')
films.head()
movie_title | release_date | video_release_date | IMDb_URL | unknown | Action | Adventure | Animation | Children's | Comedy | ... | Fantasy | Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi | Thriller | War | Western | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
movie_id | |||||||||||||||||||||
1 | Toy Story (1995) | 01-Jan-1995 | NaN | http://us.imdb.com/M/title-exact?Toy%20Story%2... | 0 | 0 | 0 | 1 | 1 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | GoldenEye (1995) | 01-Jan-1995 | NaN | http://us.imdb.com/M/title-exact?GoldenEye%20(... | 0 | 1 | 1 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
3 | Four Rooms (1995) | 01-Jan-1995 | NaN | http://us.imdb.com/M/title-exact?Four%20Rooms%... | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
4 | Get Shorty (1995) | 01-Jan-1995 | NaN | http://us.imdb.com/M/title-exact?Get%20Shorty%... | 0 | 1 | 0 | 0 | 0 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | Copycat (1995) | 01-Jan-1995 | NaN | http://us.imdb.com/M/title-exact?Copycat%20(1995) | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
5 rows × 23 columns
films['movie_title'][0:10]
movie_id 1 Toy Story (1995) 2 GoldenEye (1995) 3 Four Rooms (1995) 4 Get Shorty (1995) 5 Copycat (1995) 6 Shanghai Triad (Yao a yao yao dao waipo qiao) ... 7 Twelve Monkeys (1995) 8 Babe (1995) 9 Dead Man Walking (1995) 10 Richard III (1995) Name: movie_title, dtype: object
Now we can connect our ratings dataframe to our dataframe with title information.
Our variable topten
provides the indexes for the top movies. Since the indices are the same in films
, we can use top ten to get the titles.
films['movie_title'][topten]
item_id 408 Close Shave, A (1995) 169 Wrong Trousers, The (1993) 64 Shawshank Redemption, The (1994) 318 Schindler's List (1993) 114 Wallace & Gromit: The Best of Aardman Animatio... 483 Casablanca (1942) 12 Usual Suspects, The (1995) 50 Star Wars (1977) 272 Good Will Hunting (1997) Name: movie_title, dtype: object
films['movie_title'][elcrapo]
item_id 424 Children of the Corn: The Gathering (1996) 758 Lawnmower Man 2: Beyond Cyberspace (1996) 669 Body Parts (1991) 440 Amityville II: The Possession (1982) 1274 Robocop 3 (1993) 901 Mr. Magoo (1997) 457 Free Willy 3: The Rescue (1997) 545 Vampire in Brooklyn (1995) 688 Leave It to Beaver (1997) Name: movie_title, dtype: object
ratings_lots.loc[424].mean()
3.3488372093023258
ratings.loc[424].mean()
3.3636363636363638
Alternatively, we could just add the titles to our ratings dataframe.
How pull them from the dataframe.
titles=[title for title in films['movie_title']]
titles[0:10]
import re
titles=[title[0:10] for title in titles] #let's truncate
titles=[re.sub("\s", "_", title) for title in titles] #convert spaces to _
len(titles)
ratings.columns=titles
ratings.head()
ratings.mean(0)
ratings.mean(0).order(ascending=False)
I know that the method max
will return the highest rating.
ratings.max(1)
ratings.max?
Using the question mark marks short documentation appear! And it has the info I want:
This method returns the maximum of the values in the object. If you
want the index of the maximum, use idxmax
.
Cool!
ratings.idxmax(1)
ratings.idxmax(1).value_counts()
ratings.idxmax(1).value_counts()[1:10].plot(kind="bar", title="Movies most often the highest rated of individual users")
user_labels=["user_id", "age", "gender","occupation","zip_code"]
users=pd.read_csv('./ml-100k/u.user', sep="|", names=user_labels, index_col="user_id")
users
age | gender | occupation | zip_code | |
---|---|---|---|---|
user_id | ||||
1 | 24 | M | technician | 85711 |
2 | 53 | F | other | 94043 |
3 | 23 | M | writer | 32067 |
4 | 24 | M | technician | 43537 |
5 | 33 | F | other | 15213 |
6 | 42 | M | executive | 98101 |
7 | 57 | M | administrator | 91344 |
8 | 36 | M | administrator | 05201 |
9 | 29 | M | student | 01002 |
10 | 53 | M | lawyer | 90703 |
11 | 39 | F | other | 30329 |
12 | 28 | F | other | 06405 |
13 | 47 | M | educator | 29206 |
14 | 45 | M | scientist | 55106 |
15 | 49 | F | educator | 97301 |
16 | 21 | M | entertainment | 10309 |
17 | 30 | M | programmer | 06355 |
18 | 35 | F | other | 37212 |
19 | 40 | M | librarian | 02138 |
20 | 42 | F | homemaker | 95660 |
21 | 26 | M | writer | 30068 |
22 | 25 | M | writer | 40206 |
23 | 30 | F | artist | 48197 |
24 | 21 | F | artist | 94533 |
25 | 39 | M | engineer | 55107 |
26 | 49 | M | engineer | 21044 |
27 | 40 | F | librarian | 30030 |
28 | 32 | M | writer | 55369 |
29 | 41 | M | programmer | 94043 |
30 | 7 | M | student | 55436 |
... | ... | ... | ... | ... |
914 | 44 | F | other | 08105 |
915 | 50 | M | entertainment | 60614 |
916 | 27 | M | engineer | N2L5N |
917 | 22 | F | student | 20006 |
918 | 40 | M | scientist | 70116 |
919 | 25 | M | other | 14216 |
920 | 30 | F | artist | 90008 |
921 | 20 | F | student | 98801 |
922 | 29 | F | administrator | 21114 |
923 | 21 | M | student | E2E3R |
924 | 29 | M | other | 11753 |
925 | 18 | F | salesman | 49036 |
926 | 49 | M | entertainment | 01701 |
927 | 23 | M | programmer | 55428 |
928 | 21 | M | student | 55408 |
929 | 44 | M | scientist | 53711 |
930 | 28 | F | scientist | 07310 |
931 | 60 | M | educator | 33556 |
932 | 58 | M | educator | 06437 |
933 | 28 | M | student | 48105 |
934 | 61 | M | engineer | 22902 |
935 | 42 | M | doctor | 66221 |
936 | 24 | M | other | 32789 |
937 | 48 | M | educator | 98072 |
938 | 38 | F | technician | 55038 |
939 | 26 | F | student | 33319 |
940 | 32 | M | administrator | 02215 |
941 | 20 | M | student | 97229 |
942 | 48 | F | librarian | 78209 |
943 | 22 | M | student | 77841 |
943 rows × 4 columns
Now, let's put together our ratings and our demographic data using the join
method. We were careful to keep the user_id
s the same.
users.join(ratings)
age | gender | occupation | zip_code | 1 | 2 | 3 | 4 | 5 | 6 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
1 | 24 | M | technician | 85711 | 5.00 | 3 | 4 | 3.00 | 3 | 5.00 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 53 | F | other | 94043 | 4.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
3 | 23 | M | writer | 32067 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | 24 | M | technician | 43537 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 | 33 | F | other | 15213 | 4.00 | 3 | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
6 | 42 | M | executive | 98101 | 4.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
7 | 57 | M | administrator | 91344 | NaN | NaN | NaN | 5.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
8 | 36 | M | administrator | 05201 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
9 | 29 | M | student | 01002 | NaN | NaN | NaN | NaN | NaN | 3.75 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
10 | 53 | M | lawyer | 90703 | 3.00 | NaN | NaN | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
11 | 39 | F | other | 30329 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
12 | 28 | F | other | 06405 | NaN | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
13 | 47 | M | educator | 29206 | 3.00 | 3 | NaN | 5.00 | 1 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
14 | 45 | M | scientist | 55106 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
15 | 49 | F | educator | 97301 | 1.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
16 | 21 | M | entertainment | 10309 | 3.75 | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
17 | 30 | M | programmer | 06355 | 4.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
18 | 35 | F | other | 37212 | 5.00 | NaN | NaN | 3.00 | NaN | 5.00 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
19 | 40 | M | librarian | 02138 | NaN | NaN | NaN | 4.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
20 | 42 | F | homemaker | 95660 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
21 | 26 | M | writer | 30068 | 5.00 | NaN | NaN | NaN | 2 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
22 | 25 | M | writer | 40206 | NaN | 2 | NaN | 5.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
23 | 30 | F | artist | 48197 | 5.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
24 | 21 | F | artist | 94533 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25 | 39 | M | engineer | 55107 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
26 | 49 | M | engineer | 21044 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
27 | 40 | F | librarian | 30030 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
28 | 32 | M | writer | 55369 | NaN | NaN | NaN | NaN | 3 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
29 | 41 | M | programmer | 94043 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
30 | 7 | M | student | 55436 | NaN | 3 | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
914 | 44 | F | other | 08105 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
915 | 50 | M | entertainment | 60614 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
916 | 27 | M | engineer | N2L5N | 4.00 | 3 | 3 | 4.00 | 3 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3 |
917 | 22 | F | student | 20006 | 3.00 | NaN | 1 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
918 | 40 | M | scientist | 70116 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
919 | 25 | M | other | 14216 | 4.00 | NaN | NaN | 1.00 | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
920 | 30 | F | artist | 90008 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
921 | 20 | F | student | 98801 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
922 | 29 | F | administrator | 21114 | 5.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
923 | 21 | M | student | E2E3R | 2.25 | NaN | 3 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
924 | 29 | M | other | 11753 | 5.00 | 3 | NaN | NaN | NaN | 4.00 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
925 | 18 | F | salesman | 49036 | NaN | NaN | NaN | NaN | 4 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
926 | 49 | M | entertainment | 01701 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
927 | 23 | M | programmer | 55428 | 5.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
928 | 21 | M | student | 55408 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
929 | 44 | M | scientist | 53711 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
930 | 28 | F | scientist | 07310 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
931 | 60 | M | educator | 33556 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
932 | 58 | M | educator | 06437 | 4.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
933 | 28 | M | student | 48105 | 3.00 | NaN | NaN | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
934 | 61 | M | engineer | 22902 | 2.00 | 4 | NaN | 5.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
935 | 42 | M | doctor | 66221 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
936 | 24 | M | other | 32789 | 4.00 | NaN | 4 | NaN | NaN | 5.00 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
937 | 48 | M | educator | 98072 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
938 | 38 | F | technician | 55038 | 4.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
939 | 26 | F | student | 33319 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
940 | 32 | M | administrator | 02215 | NaN | NaN | NaN | 2.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
941 | 20 | M | student | 97229 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
942 | 48 | F | librarian | 78209 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
943 | 22 | M | student | 77841 | NaN | 5 | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
943 rows × 1686 columns
ratings_users=users.join(ratings)
ratings_users[those_lacking_discernment]
age | gender | occupation | zip_code | 1 | 2 | 3 | 4 | 5 | 6 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
4 | 24 | M | technician | 43537 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
9 | 29 | M | student | 01002 | NaN | NaN | NaN | NaN | NaN | 3.75 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
10 | 53 | M | lawyer | 90703 | 3.00 | NaN | NaN | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
12 | 28 | F | other | 06405 | NaN | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
14 | 45 | M | scientist | 55106 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
16 | 21 | M | entertainment | 10309 | 3.75 | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
24 | 21 | F | artist | 94533 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25 | 39 | M | engineer | 55107 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
34 | 38 | F | administrator | 42141 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
46 | 27 | F | marketing | 46538 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
52 | 18 | F | student | 55105 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
60 | 50 | M | healthcare | 06472 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
89 | 43 | F | administrator | 68106 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
90 | 60 | M | educator | 78155 | NaN | NaN | NaN | NaN | NaN | 3.00 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
96 | 25 | F | artist | 75206 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
97 | 43 | M | artist | 98006 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
118 | 21 | M | administrator | 90210 | NaN | NaN | NaN | NaN | 1.50 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
127 | 33 | M | none | 73439 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
131 | 59 | F | administrator | 15237 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
136 | 51 | M | other | 97365 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
137 | 50 | M | educator | 84408 | 2.25 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
138 | 46 | M | doctor | 53211 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
147 | 40 | F | librarian | 02143 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
152 | 33 | F | educator | 68767 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
164 | 47 | M | healthcare | 80123 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
173 | 56 | M | other | 22306 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
185 | 53 | F | librarian | 97403 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
187 | 26 | M | educator | 16801 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
200 | 40 | M | programmer | 93402 | 3.75 | 3 | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
210 | 39 | M | engineer | 03060 | 3.75 | NaN | NaN | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
770 | 28 | M | student | 14216 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
777 | 63 | M | programmer | 01810 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
794 | 32 | M | educator | 57197 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
801 | 22 | M | writer | 92154 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
808 | 45 | M | salesman | 90016 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
810 | 55 | F | other | 80526 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
811 | 40 | F | educator | 73013 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
819 | 59 | M | administrator | 40205 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
821 | 37 | M | engineer | 77845 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
823 | 27 | M | artist | 50322 | 3.00 | NaN | NaN | 3.75 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
835 | 44 | F | executive | 11577 | 2.25 | NaN | NaN | NaN | NaN | NaN | ... | 2.25 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
838 | 23 | M | student | 01375 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
840 | 39 | M | artist | 55406 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
848 | 46 | M | engineer | 02146 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
849 | 15 | F | student | 25652 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
850 | 34 | M | technician | 78390 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
862 | 25 | M | executive | 13820 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
867 | 24 | M | scientist | 92507 | 3.00 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
875 | 24 | F | student | 35802 | NaN | NaN | NaN | 2.25 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
876 | 41 | M | other | 20902 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
882 | 35 | M | engineer | 40503 | 3.75 | NaN | NaN | 3.00 | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
888 | 41 | M | scientist | 17036 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
891 | 51 | F | administrator | 03062 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
907 | 25 | F | other | 80526 | 3.75 | NaN | NaN | NaN | 3.75 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
909 | 50 | F | educator | 53171 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
923 | 21 | M | student | E2E3R | 2.25 | NaN | 3 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
928 | 21 | M | student | 55408 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
939 | 26 | F | student | 33319 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
941 | 20 | M | student | 97229 | 3.75 | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
942 | 48 | F | librarian | 78209 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
147 rows × 1686 columns
ratings[users['occupation']=='doctor'].mean(1)
user_id 138 3.205882 251 3.792208 299 3.464286 427 3.411290 841 3.903226 845 3.129032 935 3.923077 dtype: float64
ratings[users['occupation']=='doctor'].mean(1).mean(0)
3.5470001670869111
What genre of movie do men age 18-25 like best?
- Splitting the data into groups based on some criteria
- Applying a function to each group independently
- Combining the results into a data structure
http://pandas.pydata.org/pandas-docs/version/0.13.1/groupby.html
from IPython.display import Image
Image("http://i.imgur.com/yjNkiwL.png")
grouped=users['age'].groupby(users['occupation']) #here age is the y in the above diagram and occupation the x
grouped.mean()
occupation administrator 38.746835 artist 31.392857 doctor 43.571429 educator 42.010526 engineer 36.388060 entertainment 29.222222 executive 38.718750 healthcare 41.562500 homemaker 32.571429 lawyer 36.750000 librarian 40.000000 marketing 37.615385 none 26.555556 other 34.523810 programmer 33.121212 retired 63.071429 salesman 35.666667 scientist 35.548387 student 22.081633 technician 33.148148 writer 36.311111 dtype: float64
grouped=users['age'].groupby(users['gender'])
grouped.mean()
gender F 33.813187 M 34.149254 dtype: float64
grouped=users['age'].groupby(users['zip_code'])
grouped.mean()
zip_code 00000 54.5 01002 29.0 01040 41.0 01080 48.0 01331 37.0 01375 23.0 01581 44.0 01602 55.0 01701 49.0 01720 45.5 01754 36.0 01810 63.0 01824 45.0 01913 55.0 01915 39.0 ... K7L5J 31 L1V3W 38 L9G2B 37 M4J2K 46 M7A1A 31 N2L5N 27 N4T1A 21 R3T5K 22 T8H1N 39 V0R2H 37 V0R2M 47 V1G4L 35 V3N4P 31 V5A2B 29 Y1A6B 47 Length: 795, dtype: float64
Just as quick example, we might use a measurement of similarity called "cosine similarity." It measures how close two vectors are, with 0 being orthogonal from one another, 1 being identical.
def cosine_distance(a, b):
if len(a) != len(b):
raise ValueError, "a and b must be same length" #Steve
numerator = 0
denoma = 0
denomb = 0
for i in range(len(a)-1): #Mike's optimizations:
ai = a[i+1] #only calculate once
bi = b[i+1]
numerator += ai*bi #faster than exponent (barely)
denoma += ai*ai #strip abs() since it's squaring
denomb += bi*bi
result = numerator / (sqrt(denoma)*sqrt(denomb))
return result
cosine_distance((1,2),(3,4))
0 1
0.01613008990009257
ratings.ix[104][1]
nan
ratings_zero=ratings.fillna(0)
ratings_zero
item_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user_id | |||||||||||||||||||||
1 | 5.00 | 3 | 4 | 3.00 | 3 | 5.00 | 4.00 | 1.00 | 5.00 | 3 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 4.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 2 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 4.00 | 3 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6 | 4.00 | 0 | 0 | 0.00 | 0 | 0.00 | 2.00 | 4.00 | 4.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | 0.00 | 0 | 0 | 5.00 | 0 | 0.00 | 5.00 | 5.00 | 5.00 | 4 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
8 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 3.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
9 | 0.00 | 0 | 0 | 0.00 | 0 | 3.75 | 3.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
10 | 3.00 | 0 | 0 | 3.00 | 0 | 0.00 | 3.00 | 0.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
11 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 4.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
12 | 0.00 | 0 | 0 | 3.75 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
13 | 3.00 | 3 | 0 | 5.00 | 1 | 0.00 | 2.00 | 4.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
14 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 3.75 | 0.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
15 | 1.00 | 0 | 0 | 0.00 | 0 | 0.00 | 1.00 | 0.00 | 4.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
16 | 3.75 | 0 | 0 | 3.75 | 0 | 0.00 | 3.75 | 3.75 | 3.75 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
17 | 4.00 | 0 | 0 | 0.00 | 0 | 0.00 | 4.00 | 0.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
18 | 5.00 | 0 | 0 | 3.00 | 0 | 5.00 | 0.00 | 5.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
19 | 0.00 | 0 | 0 | 4.00 | 0 | 0.00 | 0.00 | 5.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
20 | 3.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
21 | 5.00 | 0 | 0 | 0.00 | 2 | 0.00 | 5.00 | 0.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
22 | 0.00 | 2 | 0 | 5.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
23 | 5.00 | 0 | 0 | 0.00 | 0 | 0.00 | 4.00 | 4.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
24 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 3.00 | 3.75 | 3.75 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
25 | 3.75 | 0 | 0 | 0.00 | 0 | 0.00 | 3.00 | 3.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
26 | 3.00 | 0 | 0 | 0.00 | 0 | 0.00 | 3.00 | 0.00 | 4.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
27 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 4.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
28 | 0.00 | 0 | 0 | 0.00 | 3 | 0.00 | 5.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
29 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
30 | 0.00 | 3 | 0 | 0.00 | 0 | 0.00 | 4.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
914 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
915 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
916 | 4.00 | 3 | 3 | 4.00 | 3 | 0.00 | 4.00 | 0.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 |
917 | 3.00 | 0 | 1 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
918 | 3.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
919 | 4.00 | 0 | 0 | 1.00 | 4 | 0.00 | 3.00 | 0.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
920 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
921 | 3.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 3.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
922 | 5.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
923 | 2.25 | 0 | 3 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
924 | 5.00 | 3 | 0 | 0.00 | 0 | 4.00 | 4.00 | 0.00 | 4.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
925 | 0.00 | 0 | 0 | 0.00 | 4 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
926 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
927 | 5.00 | 0 | 0 | 0.00 | 0 | 0.00 | 3.00 | 4.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
928 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 3.75 | 3.75 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
929 | 3.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
930 | 3.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 3.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
931 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
932 | 4.00 | 0 | 0 | 0.00 | 0 | 0.00 | 4.00 | 0.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
933 | 3.00 | 0 | 0 | 3.00 | 0 | 0.00 | 4.00 | 0.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
934 | 2.00 | 4 | 0 | 5.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
935 | 3.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 1.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
936 | 4.00 | 0 | 4 | 0.00 | 0 | 5.00 | 4.00 | 0.00 | 4.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
937 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 5.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
938 | 4.00 | 0 | 0 | 0.00 | 0 | 0.00 | 4.00 | 0.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
939 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 3.75 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
940 | 0.00 | 0 | 0 | 2.00 | 0 | 0.00 | 4.00 | 5.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
941 | 3.75 | 0 | 0 | 0.00 | 0 | 0.00 | 3.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
942 | 0.00 | 0 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
943 | 0.00 | 5 | 0 | 0.00 | 0 | 0.00 | 0.00 | 0.00 | 3.00 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
943 rows × 1682 columns
tempdict={}
for i in range(len(ratings_zero)-1):
tempdict[i+1]= cosine_distance(ratings_zero.ix[3], ratings_zero.ix[i+1])
similarity=pd.Series(tempdict)
most_similar=similarity.order(ascending=False)
films['movie_title'][most_similar.index]
3 Four Rooms (1995) 863 Garden of Finzi-Contini, The (Giardino dei Fin... 489 Notorious (1946) 616 Night of the Living Dead (1968) 587 Hour of the Pig, The (1993) 784 Beyond Bedlam (1993) 317 In the Name of the Father (1993) 752 Replacement Killers, The (1998) 724 Circle of Friends (1995) 335 How to Be a Player (1997) 772 Kids (1995) 529 My Life as a Dog (Mitt liv som hund) (1985) 920 Two Bits (1995) 284 Tin Cup (1996) 783 Milk Money (1994) ... 590 Hellraiser: Bloodline (1996) 888 One Night Stand (1997) 321 Mother (1996) 175 Brazil (1985) 172 Empire Strikes Back, The (1980) 565 Village of the Damned (1995) 93 Welcome to the Dollhouse (1995) 792 Bullets Over Broadway (1994) 122 Cable Guy, The (1996) 558 Heavenly Creatures (1994) 469 Short Cuts (1993) 67 Ace Ventura: Pet Detective (1994) 132 Wizard of Oz, The (1939) 765 Boomerang (1992) 471 Courage Under Fire (1996) Name: movie_title, Length: 942, dtype: object