使用 IMDB 数据集查询交叉表
Query on crosstab using IMDB dataset
我用的是IMDB数据集,最后提到了headers
问题:
1. 捕捉历年电影片名字母数量趋势的报告。
2. 视频发布年份和长度所属的分位数之间的交叉表。结果应包含年份、min_length、max_length、num_videos_less_than25Percentile、num_videos_25_50Percentile、num_videos_50_75Percentile、num_videos_greaterthan75Precentile
第一部分很容易解决。对于第二部分,作为交叉表的初学者,我知道语法但有人可以指导如何继续解决方案。
如果需要更多信息,请告诉我。
imdb.columns
Index(['fn', 'tid', 'title', 'wordsInTitle', 'url', 'imdbRating',
'ratingCount', 'duration', 'year', 'type', 'nrOfWins',
'nrOfNominations', 'nrOfPhotos', 'nrOfNewsArticles', 'nrOfUserReviews',
'nrOfGenre', 'Action', 'Adult', 'Adventure', 'Animation', 'Biography',
'Comedy', 'Crime', 'Documentary', 'Drama', 'Family', 'Fantasy',
'FilmNoir', 'GameShow', 'History', 'Horror', 'Music', 'Musical',
'Mystery', 'News', 'RealityTV', 'Romance', 'SciFi', 'Short', 'Sport',
'TalkShow', 'Thriller', 'War', 'Western'],
dtype='object')
可以用groupby
解决:
import pandas as pd
import numpy as np
df = pd.read_csv('https://raw.githubusercontent.com/mandarkadam/Data-Mining-IMDB-score/master/imdb-movies-dataset%20-%20test.csv')
df.groupby('year').duration.agg(
min_length='min',
max_length='max',
num_videos_less_than25Percentile=lambda x: np.count_nonzero((x<x.quantile(.25)).values),
num_videos_25_50Percentile=lambda x: np.count_nonzero(((x>=x.quantile(.25))&(x<x.quantile(.5))).values),
num_videos_50_75Percentile=lambda x: np.count_nonzero(((x>=x.quantile(.5))&(x<x.quantile(.75))).values),
num_videos_greaterthan75Precentile=lambda x: np.count_nonzero((x>=x.quantile(.75)).values)
).astype('Int64')
结果:
min_length max_length num_videos_less_than25Percentile num_videos_25_50Percentile num_videos_50_75Percentile num_videos_greaterthan75Precentile
year
1888.0 2 2 0 0 0 1
1894.0 22 22 0 0 0 1
1904.0 <NA> <NA> 0 0 0 0
1910.0 660 660 0 0 0 1
1911.0 1080 1080 0 0 0 1
... ... ... ... ... ... ...
2009.0 3000 7080 4 2 5 4
2010.0 3120 6840 1 1 1 2
2011.0 5580 7620 2 1 1 2
2012.0 1800 6000 1 0 1 1
2014.0 1800 1800 0 0 0 1
[94 rows x 6 columns]
我用的是IMDB数据集,最后提到了headers
问题: 1. 捕捉历年电影片名字母数量趋势的报告。 2. 视频发布年份和长度所属的分位数之间的交叉表。结果应包含年份、min_length、max_length、num_videos_less_than25Percentile、num_videos_25_50Percentile、num_videos_50_75Percentile、num_videos_greaterthan75Precentile
第一部分很容易解决。对于第二部分,作为交叉表的初学者,我知道语法但有人可以指导如何继续解决方案。
如果需要更多信息,请告诉我。
imdb.columns
Index(['fn', 'tid', 'title', 'wordsInTitle', 'url', 'imdbRating',
'ratingCount', 'duration', 'year', 'type', 'nrOfWins',
'nrOfNominations', 'nrOfPhotos', 'nrOfNewsArticles', 'nrOfUserReviews',
'nrOfGenre', 'Action', 'Adult', 'Adventure', 'Animation', 'Biography',
'Comedy', 'Crime', 'Documentary', 'Drama', 'Family', 'Fantasy',
'FilmNoir', 'GameShow', 'History', 'Horror', 'Music', 'Musical',
'Mystery', 'News', 'RealityTV', 'Romance', 'SciFi', 'Short', 'Sport',
'TalkShow', 'Thriller', 'War', 'Western'],
dtype='object')
可以用groupby
解决:
import pandas as pd
import numpy as np
df = pd.read_csv('https://raw.githubusercontent.com/mandarkadam/Data-Mining-IMDB-score/master/imdb-movies-dataset%20-%20test.csv')
df.groupby('year').duration.agg(
min_length='min',
max_length='max',
num_videos_less_than25Percentile=lambda x: np.count_nonzero((x<x.quantile(.25)).values),
num_videos_25_50Percentile=lambda x: np.count_nonzero(((x>=x.quantile(.25))&(x<x.quantile(.5))).values),
num_videos_50_75Percentile=lambda x: np.count_nonzero(((x>=x.quantile(.5))&(x<x.quantile(.75))).values),
num_videos_greaterthan75Precentile=lambda x: np.count_nonzero((x>=x.quantile(.75)).values)
).astype('Int64')
结果:
min_length max_length num_videos_less_than25Percentile num_videos_25_50Percentile num_videos_50_75Percentile num_videos_greaterthan75Precentile
year
1888.0 2 2 0 0 0 1
1894.0 22 22 0 0 0 1
1904.0 <NA> <NA> 0 0 0 0
1910.0 660 660 0 0 0 1
1911.0 1080 1080 0 0 0 1
... ... ... ... ... ... ...
2009.0 3000 7080 4 2 5 4
2010.0 3120 6840 1 1 1 2
2011.0 5580 7620 2 1 1 2
2012.0 1800 6000 1 0 1 1
2014.0 1800 1800 0 0 0 1
[94 rows x 6 columns]