美文网首页
深入浅出Pandas--Pandas快速入门

深入浅出Pandas--Pandas快速入门

作者: 亦是旅人呐 | 来源:发表于2022-05-03 18:16 被阅读0次
    对应书本第一部分第一章第三节

    开始学习前,将相关环境配置好

    数据集

    下载地址:https://www.gairuo.com/file/data/dataset/team.xlsx

    数据集说明:一个学生各季度成绩总表
    name:学生的姓名,这列没有重复值,一个学生一行,即一条数据,共100条。
    team:所在的团队、班级,这个数据会重复。
    Q1~Q4:各个季度的成绩,可能会有重复值。
    

    数据读取

    # 在jupyter notebook中
    # 首先导入Pandas库,pd为别名
    import pandas as pd
    
    # 下面两种方式选其一,第二种表示下载好数据集并放在工作目录中
    df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
    df = pd.read_excel('team.xlsx')
    
    # 如果是CSV格式文件,使用pd.read_csv()
    
    df
    

    查看数据

    df.head() # 查看前5条,括号里可以写明你想看的条数
    df.tail() # 查看尾部5条
    df.sample(5) # 随机查看5条
    

    验证数据

    df.shape # (100, 6) 查看行数和列数
    df.info() # 查看索引、数据类型和内存信息
    df.describe() # 查看数值型列的汇总统计
    df.dtypes # 查看各字段类型
    df.axes # 显示数据行和列名
    df.columns # 列名
    

    建立索引

    df.set_index('name', inplace=True) # 建立索引并生效
    

    其中可选参数inplace=True会将指定好索引的数据再赋值给df使索引生效,否则索引不会生效。注意,这里并没有修改原Excel,从我们读取数据后就已经和它没有关系了,我们处理的是内存中的df变量

    将name建立索引后,就没有从0开始的数字索引了

    df.head()
    

    数据选取

    选择列
    # 查看指定列,如Q1
    df['Q1']
    df.Q1 # 同上,如果列名符合Python变量名要求,可使用
    

    这里返回的是一个Series类型数据,可以理解为数列,它也是带索引的。之前建立的索引在这里发挥出了作用,否则我们的索引是一个数字(0-99),无法知道与之对应的是谁的数据。

    # 选择多列
    df[['team', 'Q1']] # 只看这两列,注意括号
    df.loc[:, ['team', 'Q1']] # 和上一行效果一样
    

    df.loc[x, y]是一个非常强大的数据选择函数,其中x代表行,y代表列(上面例子中,行为一个冒号,表示选取所有行),行和列都支持条件表达式,也支持类似列表那样的切片(如果要用自然索引,需要用df.iloc[])。

    选择行

    # 用指定索引选取
    df[df.index == 'Liver'] # 指定姓名
    # 用自然索引选择,类似列表的切片
    df[0:3] # 取前三行
    df[0:10:2] # 在前10个中每两个取一个
    df.iloc[:10,:] # 前10个
    

    指定行和列

    # 同时给定行和列的显示范围:
    df.loc['Ben', 'Q1':'Q4'] # 只看Ben的四个季度成绩
    df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行区间,从Eorge到Alexander
    

    条件选择

    # 单一条件
    df[df.Q1 > 90] # Q1列大于90的
    df[df.team == 'C'] # team列为'C'的
    df[df.index == 'Oscar'] # 指定索引即原数据中的name
    
    # 组合条件
    df[(df['Q1'] > 90) & (df['team'] == 'C')] # and关系
    df[df['team'] == 'C'].loc[df.Q1>90] # 多重筛选
    

    排序

    df.sort_values(by='Q1') # 按Q1列数据升序排列
    df.sort_values(by='Q1', ascending=False) # 降序
    df.sort_values(['team', 'Q1'], ascending=[True, False]) # team升序,Q1降序
    

    分组聚合

    可以实现类似SQL的groupby那样的数据透视功能:

    df.groupby('team').sum() # 按团队分组对应列相加
    df.groupby('team').mean() # 按团队分组对应列求平均
    
    # 不同列不同的计算方法
    df.groupby('team').agg({'Q1': sum, # 总和
                            'Q2': 'count', # 总数
                            'Q3':'mean', # 平均
                            'Q4': max}) # 最大值
    

    数据转换

    # 转置
    # 以A-Q1、E-Q4两点连成的折线为轴对数据进行翻转
    df.groupby('team').sum().T
    

    增加列

    用Pandas增加一列非常方便,就与新定义一个字典的键值一样。

    df['one'] = 1 # 增加一个固定值的列
    df['total'] = df.Q1 + df.Q2 + df.Q3 + df.Q4 # 增加总成绩列
    
    # 将计算得来的结果赋值给新列
    df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x), axis=1)
    df['total'] = df.sum(axis=1) # 可以把所有为数字的列相加
    df['avg'] = df.total/4 # 增加平均成绩列
    

    统计分析

    df.mean() # 返回所有列的均值
    df.mean(1) # 返回所有行的均值,下同
    
    image.png
    df.corr() # 返回列与列之间的相关系数
    df.count() # 返回每一列中的非空值的个数
    
    df.max() # 返回每一列的最大值
    df.min() # 返回每一列的最小值
    
    df.median() # 返回每一列的中位数
    df.std() # 返回每一列的标准差
    
    df.var() # 方差
    df.mode() # 众数
    

    绘图

    import matplotlib
    df['Q1'].plot() # Q1成绩的折线分布
    
    image.png
    df.loc['Ben','Q1':'Q4'].plot() # ben四个季度的成绩变化
    
    df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱状图
    df.loc[ 'Ben','Q1':'Q4'].plot.barh() # 横向柱状图
    
    # 各Team四个季度总成绩趋势
    # 这里重新读取了原始数据
    df1 = pd.read_excel('team.xlsx')
    df1.groupby('team').sum().T.plot()
    
    # 各组人数对比
    df.groupby('team').count().Q1.plot.pie()
    

    导出

    轻松导出Excel和CSV文件

    df.to_excel('team-done.xlsx') # 导出 Excel文件
    df.to_csv('team-done.csv') # 导出 CSV文件
    

    end~

    相关文章

      网友评论

          本文标题:深入浅出Pandas--Pandas快速入门

          本文链接:https://www.haomeiwen.com/subject/vxqiyrtx.html