大家好,我是欧K。
本期为大家带来Pandas常用操作命令介绍的第三篇,主要介绍pandas的数据排序、分组部分常用到一些指令,本系列会不断进行补充更新,希望对你有所帮助。
👉系列文章:
Pandas常用操作命令(一)
Pandas常用操作命令(二)
5. 排序
示例数据:
以test.csv文件为例:
filename = 'test.csv' df = pd.read_csv(filename, encoding='gbk') df
# 重命名列 df.columns = ['姓名','性别','语文','数学','英语','城市','省份']
5.1 拆分列,生成新的Dataframe
df1 = df['姓名'].str.split('-',expand=True) df1.columns = ['学号','姓名'] df1['性别'] = df['性别'] df1['语文'] = df['语文'] df1['数学'] = df['数学'] df1['英语'] = df['英语'] df1['城市'] = df['城市'] df1['省份'] = df['省份'] df1.dropna(inplace = True)
5.2 重置索引
df_last = df1.reset_index(drop=True)
5.2 按照语文成绩升序排序,默认升序排列
df_last.sort_values('语文')
5.3 按照数学成绩降序排序
df_last.sort_values('数学', ascending=False)
5.4 先按语文成绩升序排列,再按数学成绩降序排列
df_last.sort_values(['语文','数学'], ascending=[True,False])
5.5 语文成绩80及以上
df_last[df_last['语文']>=80] df_last.query('语文 > 80')
5.6 语文成绩80及以上以及数学成绩90分及以上
df_last[(df_last['语文']>=80) & (df_last['数学']>=90)]
5.7 语文成绩80及以上或数学成绩90分及以上
df_last[(df_last['语文']>=80) | (df_last['数学']>=90)]
5.8输出成绩100的行和列号
row, col = np.where(df_last.values == 100) print('%s\t%s'%(row,col)) [0 7] [4 5]
5.9 增加一列“省份-城市”
df_last['省份-城市'] = df_last['省份'] + '-' + df_last['城市']
5.10 增加一列总分
df_last['总分'] = df_last[['语文','数学','英语']].sum(axis = 1)
5.11 按照总分、语文、数学、英语成绩依次排序
df_last.sort_values(by =['总分','语文','数学','英语'],ascending=False)
5.12 新增一列表示学生语文成绩等级的列(优秀、良好、中等、不及格)
def get_letter_grade(score): if score>=90: return '优秀' elif score>=80: return '良好' elif score>=60: return '中等' else: return '不及格' df_last['语文等级'] = df_last['语文'].apply(lambda score: get_letter_grade(score))
6. 数据分组
df2:
6.1 一列分组
df2.groupby('省份').groups
{'上海': ['009'], '广东': ['003', '010'], '江苏': ['001', '013'], '浙江': ['011'], '海南': ['005'], '重庆': ['007']}
6.2 多列分组
df2.groupby(['省份','城市']).groups
{('上海', '上海'): ['009'], ('广东', '广州'): ['003'], ('广东', '深圳'): ['010'], ('江苏', '南京'): ['001', '013'], ('浙江', '杭州'): ['011'], ('海南', '海口'): ['005'], ('重庆', '重庆'): ['007']}
6.3 每组的统计数据(横向显示)
df2.groupby('省份').describe()
6.4 每组的统计数据(纵向显示)
df2.groupby('省份').describe().unstack()
6.5 查看指定列的统计信息
df2.groupby('省份').describe()['语文']
6.6 分组大小
df2.groupby('省份').count() df2.groupby('省份').agg(np.size)
6.7 分组成绩最大值
df2.groupby('省份').max() df2.groupby('省份').agg(np.max)
6.8 分组成绩最小值
df2.groupby('省份').min() df2.groupby('省份').agg(np.min)
6.9 分组成绩总和
df2.groupby('省份').sum() df2.groupby('省份').agg(np.sum)
6.10 分组平均成绩
df2.groupby('省份').mean() df2.groupby('省份').agg(np.mean)
6.11 按省份分组,计算英语成绩总分和平均分
df2.groupby('省份')['英语'].agg([np.sum, np.mean])
6.12 按省份、城市分组计算平均成绩
df2.groupby(['省份','城市']).agg(np.mean)
6.13 不同列不同的计算方法
df2.groupby('省份').agg({'语文': sum, # 总和 '数学': 'count', # 总数 '英语':'mean'}) # 平均
6.14 性别分别替换为1/0
df2 = df2.dropna() df2['性别'] = df2['性别'].map({'男':1, '女':0})
6.15 增加一列按省份分组的语文平均分
df2['语文平均分'] = df2.groupby('省份')['语文'].transform('mean')
6.16 输出语文成绩最高的男生和女生(groupby默认会去掉空值)
def get_max(g): df = g.sort_values('语文',ascending=True) print(df) return df.iloc[-1,:] df2.groupby('性别').apply(get_max)
6.17 按列省份、城市进行分组,计算语文、数学、英语成绩最大值的透视表
df.pivot_table(index=['省份','城市'], values=['语文','数学','英语'], aggfunc=max)
未完待续。。。
END
以上就是本期为大家整理的全部内容了,赶快练习起来吧,喜欢的朋友可以点赞、点在看也可以分享让更多人知道。