本文是视频Python数据分析三剑客 数学建模基础 numpy、pandas、matplotlib的学习笔记。
————————————————————————————————————————————————————
目录
- 数据格式转换
- 排序
- 基本统计分析
- 数据透视
- 第四次课作业
- (1)读取上次作业保存的数据,酒店数据1.xlsx
- (2)查看“评分”的格式,并分别进行升序和降序排序
- (3)对酒店按照价格进行排名,计算“油尖旺”地区的均价。
- (4)对酒店数据进行描述性统计,并求所有价格的均值方差,最大最小值,中值。
- (5)计算评分和价格之间的的相关系数,协方差
- (6)按照评分降序排序,评分相同时按价格升序排序。
- (7)计算一下,评分小于3分的酒店数量和占比。
- (8)计算一下,酒店评分大于等于4分的酒店的价格均值。
- (9)计算出每个地区的酒店占总酒店数量的比例。
- (10)找出酒店评分人数排名前20的酒店,并计算他们的价格均值。
- (11)查看酒店分布的类型数量和地区数量,并统计各个类型和地区包含的酒店数量。
- (12)用数据透视表,计算每个类型的酒店的评分人数总数量。
- (13)用数据透视表,计算每个类型的酒店价格的均值和标准差
- (14)用数据透视表,计算每个地区酒店价格和评分的最大值和最小值
- (15)用数据透视表,计算每个地区和类型的酒店的评分的均值和标准差
数据格式转换
查看格式
df['投票人数'].dtype
dtype('float64')
修改格式
df['投票人数']=df['投票人数'].astype('int')
df[:5]
将年份转化为整数格式,异常值查找
df['年代']=df['年代'].astype('int')
发现报错,错误为
查找该位置
df[df['年代']=='2008\u200e']
将该位置的年代值修改:
df.loc[15205,'年代']=2008
df.loc[15205]
最后修改年代数据类型
df['年代']=df['年代'].astype('int')
df
将时长转化为整数格式
df['时长']=df['时长'].astype(int)
又发现报错,错误为
查找该位置
df[df['时长']== '12J']
因时长未知,故将其删除
df.drop([32949],inplace=True)
转换时长数据类型为int
df['时长']=df['时长'].astype(int)
操作成功
排序
默认排序
按照index进行排序
按照投票人数进行排序
默认根据从小到大进行排序
df.sort_values('投票人数')[:5]
增加参数ascending=False,使按照降序排序
df.sort_values('投票人数',ascending=False)[:5]
按照年代进行排序
df.sort_values(by='年代')[:5]
多个值进行排序,先按照评分,再按照投票人数
df.sort_values(by=['评分','投票人数'],ascending=False)
基本统计分析
描述性统计:
通过DataFrame.describe()函数对数值型数据进行描述性统计
df.describe()
通过描述性统计,可以发现异常值
df[df['年代']>2021]
df[df['时长']>1000]
删除异常值
df.drop(df[df['年代']>2018].index,inplace=True)
df.drop(df[df['时长']>1000].index,inplace=True)
df.describe()
对index重新赋值
删除值可能会造成部分位置为空,此时可对index重新赋值
df.index=range(len(df))
最值
df['投票人数'].max()
692795
df['投票人数'].min()
21
均值
df['投票人数'].mean()
6268.944054294849
中值
df['投票人数'].median()
354.0
方差和标准差(反映数据离散程度)
方差:
df['评分'].var()
1.596899503257773
标准差:
df['评分'].std()
1.2636848908085327
求和
df['投票人数'].sum()
239235443
相关系数
df[['投票人数','评分']].corr()
协方差
df[['投票人数','评分']].cov()
计数
统计表格长度
len(df)
38162
统计唯一值的个数
df['产地'].unique()
array(['美国', '意大利', '中国大陆', '日本', '法国', '英国', '韩国', '中国香港', '阿根廷', '德国',
'印度', '其他', '加拿大', '波兰', '泰国', '澳大利亚', '西班牙', '俄罗斯', '中国台湾', '荷兰',
'丹麦', '比利时', 'USA', '苏联', '巴西', '瑞典', '西德', '墨西哥'], dtype=object)
len(df['产地'].unique())
28
可以用数据替换的方式将重复数据进行合并,如美国和USA,德国和西德,俄罗斯和苏联
df['产地'].replace('USA','美国',inplace=True)
df['产地'].unique()
array(['美国', '意大利', '中国大陆', '日本', '法国', '英国', '韩国', '中国香港', '阿根廷', '德国',
'印度', '其他', '加拿大', '波兰', '泰国', '澳大利亚', '西班牙', '俄罗斯', '中国台湾', '荷兰',
'丹麦', '比利时', '苏联', '巴西', '瑞典', '西德', '墨西哥'], dtype=object)
df['产地'].replace(['西德','苏联'],['德国','俄罗斯'],inplace=True)
df['产地'].unique()
len(df['产地'].unique())
25
计算每一年的电影数量:
计算年代数量:
df['年代'].unique()
array([1994, 1957, 1997, 1993, 2012, 2013, 2003, 2016, 2009, 2008, 2001,
1931, 1961, 2010, 2004, 1998, 1972, 1939, 2015, 1946, 2011, 1982,
1960, 2006, 1988, 2002, 1995, 1996, 1984, 2014, 1953, 2007, 2000,
1967, 1983, 1963, 1977, 1966, 1971, 1974, 1985, 1987, 1973, 1962,
1969, 1989, 1979, 1981, 1936, 1954, 1992, 1970, 1991, 2005, 1920,
1933, 1990, 1999, 1896, 1965, 1921, 1947, 1975, 1964, 1943, 1928,
1986, 1895, 1949, 1932, 1905, 1940, 1908, 1900, 1978, 1951, 1958,
1898, 1976, 1938, 1907, 1948, 1952, 1926, 1955, 1906, 1959, 1934,
1944, 1888, 1909, 1925, 1956, 1923, 1945, 1913, 1903, 1904, 1980,
1968, 1917, 1935, 1942, 1950, 1902, 1941, 1930, 1937, 1922, 1916,
1929, 1927, 1919, 1914, 1912, 1924, 1918, 1899, 1901, 1915, 1892,
1894, 1910, 1897, 1911, 1890, 2018])
len(df['年代'].unique())
127
df['年代'].value_counts()[:10]
2012 2018
2013 1977
2008 1926
2014 1867
2010 1863
2011 1845
2009 1837
2007 1685
2015 1569
2006 1488
Name: 年代, dtype: int64
电影产出前五的国家或地区:
df['产地'].value_counts()[:5]
美国 11712
日本 5007
中国大陆 3791
中国香港 2847
法国 2787
Name: 产地, dtype: int64
数据保存
df.to_excel('movie_data2.xlsx')
数据透视
pandas提供的pivot_table,可实现Excel的数据透视表功能
基础形式
pd.pivot_table(df,index='年代')
查看结果
pd.set_option('max_columns',100)#展示100列
pd.set_option('max_rows',500)#展示500行
使用多个索引
pd.pivot_table(df,index=['年代','产地'])
指定需要统计汇总的数据
pd.pivot_table(df,index=['年代','产地'],values=['评分'])
指定函数,来统计不同的统计值
pd.pivot_table(df,index=['年代','产地'],values=['投票人数'],aggfunc=np.sum)
通过将“投票人数”列和“评分”列进行对应分组,对“产地”实现数据聚合和总结
pd.pivot_table(df,index='产地',values=['投票人数','评分'],aggfunc=[np.sum,np.mean])
NaN难以处理,移除可使用fill_value将其设置成0
pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0)
加入margins=True,可在下方显示总和数据
pd.pivot_table(df,index=['产地'],aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
…
对各个地区的投票人数求和,对评分求均值
对不同值执行不同的函数:可向aggfunc传递一个字典,但这样必须将标签做的简洁
pd.pivot_table(df,index='产地',values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
对各个年份的投票人数求和,对评分求均值
pd.pivot_table(df,index='年代',values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
透视表过滤
table=pd.pivot_table(df,index='年代',values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
type(table)
pandas.core.frame.DataFrame
table[:5]
table[table.index==1994]
table.sort_values('评分',ascending=False)
同样可以按照多个索引进行汇总,形成层次化的表格结构
pd.pivot_table(df,index=['产地','年代'],values=['投票人数','评分'],aggfunc={'投票人数':np.sum,'评分':np.mean},fill_value=0)
第四次课作业
(1)读取上次作业保存的数据,酒店数据1.xlsx
df=pd.read_excel('酒店数据11.xlsx',index_col=0)
df
(2)查看“评分”的格式,并分别进行升序和降序排序
df['评分'].dtype
dtype('float64')
df.sort_values(by='评分')
df.sort_values('评分',ascending=False)
(3)对酒店按照价格进行排名,计算“油尖旺”地区的均价。
df.sort_values('价格')
df
df['价格'].mean()
681.6599496221662
(4)对酒店数据进行描述性统计,并求所有价格的均值方差,最大最小值,中值。
df.describe()
df['价格'].sum()
270619
df['价格'].var()
821348.2805383828
df['价格'].median()
418.0
(5)计算评分和价格之间的的相关系数,协方差
df[['评分','价格']].corr()
df[['评分','价格']].cov()
(6)按照评分降序排序,评分相同时按价格升序排序。
df.sort_values(['评分','价格'],ascending=[False,True])
(7)计算一下,评分小于3分的酒店数量和占比。
len(df[df['评分']<3])
12
len(df[df['评分']<3])/len(df)
0.030226700251889168
(8)计算一下,酒店评分大于等于4分的酒店的价格均值。
df[df['评分']>=4]['价格'].mean()
742.2205882352941
(9)计算出每个地区的酒店占总酒店数量的比例。
df['地区'].value_counts()/len(df)
油尖旺 0.465995
其他 0.141058
湾仔 0.103275
中西区 0.083123
九龙城 0.052897
东区 0.040302
离岛 0.027708
观塘 0.017632
荃湾 0.017632
葵青 0.012594
南区 0.012594
沙田 0.010076
元朗 0.005038
屯门 0.005038
罗湖区 0.002519
深水埗区 0.002519
Name: 地区, dtype: float64
(10)找出酒店评分人数排名前20的酒店,并计算他们的价格均值。
df.sort_values('评分人数',ascending=False)[:20]
df.sort_values('评分人数',ascending=False)[:20]['价格'].mean()
1110.55
(11)查看酒店分布的类型数量和地区数量,并统计各个类型和地区包含的酒店数量。
df['类型'].unique()
array(['休闲度假', '浪漫情侣', '商务出行', '海滨风光', '地铁周边', '交通方便', '亲子酒店', '其他', '民宿',
'印象好', '酒店公寓', '青年旅舍', '客栈', '火车站周边', '老板热情', '环境不错', '干净卫生',
'大学周边'], dtype=object)
len(df['类型'].unique())
18
df['地区'].unique()
array(['元朗', '东区', '油尖旺', '湾仔', '观塘', '中西区', '南区', '离岛', '九龙城', '荃湾',
'屯门', '葵青', '其他', '沙田', '深水埗区', '罗湖区'], dtype=object)
len(df['地区'].unique())
16
(12)用数据透视表,计算每个类型的酒店的评分人数总数量。
pd.pivot_table(df,index='类型',values='评分人数')
(13)用数据透视表,计算每个类型的酒店价格的均值和标准差
pd.pivot_table(df,index='类型',values='价格',aggfunc=[np.var,np.std])
(14)用数据透视表,计算每个地区酒店价格和评分的最大值和最小值
pd.pivot_table(df,index='地区',values=['价格','评分'],aggfunc=[np.min,np.max])
(15)用数据透视表,计算每个地区和类型的酒店的评分的均值和标准差
pd.pivot_table(df,index=['地区','类型'],values=['评分'],aggfunc=[np.mean,np.std])