大数据分析07 数据链接
连接两个数据集
- 合并
必须指定列参数,普通链接空值不展示
pd.merge(students, scores, left_on='ID', right_on='SID')
- 内连接,外连接
frame = pd.merge(students, scores, left_on="ID", right_on="SID", how='left')
frame
- 判断空值
pd.isna判断是否是空值,如果是返回True; pd.isnull
frame[pd.isna(frame['score'])==True]['name']
- join连接
两个数据集index一致,直接用join
students.join(scores)
merge 是panda的函数
join是dataframe的函数
先过滤数据在分组
数据读取
- 读取数据
import pandas as pdunames = ['uid', 'age', 'gender', 'occupation', 'zip']
users = pd.read_table('dataSources/MovieLens/u.user', sep='|', header=None, names=unames)users.head(5)
rnames = ['uid', 'mid', 'rating', 'timestamp']
ratings = pd.read_table('dataSources/MovieLens/u.data', sep='\t', header=None, names=rnames)ratings[:5]
- 合并
frame = pd.merge(ratings, users)
- 聚合
按性别分组排序平均分
frame['rating'].groupby(frame['gender']).mean()
- 按分值和性别统计
round四舍五入,参数-1为四舍五入到十位
frame['rating'].groupby([frame['age'].apply(round, args=[-1]), frame['gender']]).mean()
- 均值和聚合多个参数
.agg('mean','count')
- 分组统计并排序
pd.set_option('display.max_rows', None) # 显示设置
frame['rating'].groupby([frame['gender'], frame['title']]).agg(['mean', 'count']).sort_values(by=['mean', 'count'], ascending=[False, False])
- 过滤聚合结果
result[result['count'] > 100].sort_values(by='mean', ascending=False)
- 多条件分组汇总二维表格
性别和电影 维度统计 平均评分,性别为行 电影为列
frame.pivot_table('rating', index='title', columns='gender', aggfunc='mean')
- 多条件统计
统计按性别电影评分大于100的,按性别排序
result = frame.pivot_table('rating', index='title', columns='gender', aggfunc='mean')result1 = result.loc[ratings_by_title.index[ratings_by_title > 100]]result1.sort_values(by='F', ascending=False)
- 求男女评分差异
result['diff'] = (result['M'] - result['F']).apply(abs)
result.sort_values(by='diff', ascending=False)
-算标准差
frame['rating'].groupby([frame['gender'], frame['title']]).std().sort_values(ascending= False)
子查询
- 数据源
data = {'ID': ['000001', '000002', '000003', '000004', '000005', '000006', '000007'],'name':['黎明', '赵怡春', '张富平', '白丽', '牛玉德', '姚华', '李南'], 'gender':[True, False, True, False, True, False, True], 'age':[16, 20, 18, 18, 17, 18, 16], 'height':[1.88, 1.78, 1.81, 1.86, 1.74, 1.75, 1.76]}frame = pd.DataFrame(data)
frame
- 查询最高身高
maxHeight = frame[frame['gender'] == False]['height'].max()
frame[(frame['gender'] == False) & (frame['height'] == maxHeight)]
- 查询身高前几
数据重复无法获得精确答案
maxHeight = frame['height'].sort_values(ascending=False).head(2)
- 值相同取出前几
maxHeight = frame['height'].drop_duplicates().sort_values(ascending=False).head(2)
maxHeight
- 查询指定伸到结果集的学生
frame[frame['height'].isin(maxHeight)]