美文网首页
Pandas3.1(基本操作)

Pandas3.1(基本操作)

作者: 山猪打不过家猪 | 来源:发表于2023-03-03 05:13 被阅读0次

    1.PANDAS读取表以及基本信息

    1.1读取指定分隔符无头的csv

    image.png
    fpath = "./datas/access_pvuv.txt"  #relative path
    df = pd.read_csv(
        fpath,
        sep = "\t", ##separator 
        header = None, ##no headers
        names = ["pdata","pv","uv"]  ##costom own column name
    )
    
    

    1.2读取表的基本信息

    1.2.1表的信息所有信息

    df.info()
    
    image.png

    我们可以看出,总共4238行,但是其中有几行的数据少于这个数,所以这几行的数据是有NAN

    1.2.2 读取表的所有信息简版

    df.shape
    

    (3656, 16)

    1.3 读取列名

    • 直接读取
    df.columns
    >>>
    Index(['male', 'age', 'education', 'currentSmoker', 'cigsPerDay', 'BPMeds',
           'prevalentStroke', 'prevalentHyp', 'diabetes', 'totChol', 'sysBP',
           'diaBP', 'BMI', 'heartRate', 'glucose', 'TenYearCHD'],
          dtype='object')
    
    • 读取表头
    df.head(0)
    
    image.png

    2.缺失值

    2.1缺失值查看

    2.1.1 查看所有含有缺失值的列

    df.isnall().any(axis=0)
    
    image.png

    2.1.2 查看所有含有缺失值的行

    • 查出有缺失的行
    df.isnall().any(axis=1).sum()
    
    • 统计缺失行的数量
    df.isnall().any(axis=1).sum()
    >>>
    582
    

    2.1.3 查出指定列名的缺失

    • 查询education列的缺失
    df["education"].isnull().sum()
    >>>
    105 #总共缺失了105个数
    

    2.1.4 查出所有缺失行的所有数据

    df[df["education"].isnull()]
    
    image.png

    2.2缺失值删除

    2.2.1 删除所有具有NAN的行

    • 不在原表中删除
    df.dropna()
    

    2.2.2删除全部为NAN的行

    df.dropna(how='all')
    

    2.2.3 替换

    • 默认是不替换,需要拷贝新的dfd
    • 替换,可以直接一直用
    df.dropna(inplace=True)
    

    2.3缺失值填补

    2.3.1 用下面一行的值填充

    df.fillna(method="backfill")
    

    2.3.2 用上面一行的值填充

    df.fillna(method="pad")
    

    2.3.3 用这一列的平均值/中位数/0 填充

    • 平均值
    df.fillna(df.mean())
    
    • 中位数
    df.fillna(df.median())
    
    • 0
    df.fillna(0)
    

    3.DataFrame切片

    3.1 获取行

    • 获取前2行
    df[:2]
    
    image.png

    3.2获取列

    • 获取一列
    df['currentSmoker']
    
    • 获取多列
    df[['currentSmoker','age']]
    
    image.png

    3.3 loc和iloc

    3.3.0 设置索引

    • 将ymd列作为索引
    df.set_index('ymd',inplace=True)
    

    能做索引的列,一定是唯一且不重复的列

    3.3.1 loc[行,列] 索引

    • 使用loc第二列的数,下标从0开始
    df.loc[1]
    
    • 获取前五行,列名是male 和age的数据
    df.loc[0:4,['male','age']]
    
    image.png

    3.3.1 iloc[行索引,列索引] 索引的下标

    在使用默认的Index时候,iloc和loc的用法是一样的

    3.4 根据条件获取行和列

    3.4.1列名+条件获取

    • 获取成绩大于60的所有数据
    df[df['age']>60]
    
    image.png
    • 获取成绩大于60的人数统计
    (df['age']>60).sum()
    >>>
    597
    
    • 获取年龄大于60的列的male和education列的前5行
    df[df['age']>60][['male','education']][0:5]
    
    image.png

    3.4.2loc[条件,列名]

    • 获取年龄大于60,列名为male和education
    df.loc[df['age']>60,['male','education']]
    
    image.png

    3.4.3 通过.values先判断出结果的布尔值,在选择

    • 大于60的布尔值
    (df['age']>60).values
    >>>
    array([False, False, False, ..., False, False, False])
    
    • 再获取
    df[(df['age']>60).values]
    

    4. 表连接

    4.1横向连接merge

    类似于sql的 inner join/left join

    4.1.1 连接的列名一样

    • 学生信息stu_info:学生 姓名,ID,年龄,学号
    • 学生成绩stu_score:学号,数学成绩,语文成绩
    pd.merge(stu_info,stu_score,on='stuId',how='left')
    
    image.png

    4.1.2连接的列名不一样

    学生表里的学生学号是:userId
    成绩表里的学号是:stuId

    pd.merge(stu_info,stu_score,left_on='userId',rigth_on = 'stuId',how='left')
    
    image.png
    • 上面连接后,会多出一列,删除
    df.drop('stuId',axis=1)
    
    • 修改列名
    df.rename(columns={'userId': 'studentId'}, inplace=True)
    

    4.1.3连接两个使用默认index的表

    score1 =pd.DataFrame({'score_a':[100,90,80]},index=['001','002','003'])
    score2 =pd.DataFrame({'score_b':[56,44,30]},index=['001','002','003'])


    image.png
    pd.merge(score1,score2,left_index=True,right_index=True)
    
    image.png

    4.2纵向连接concat

    类似于sql里的union join

    pd.concat[[stu1,stu2]]
    
    image.png

    5.行转列,列转行

    5.1行转列

    image.png
    df = df.pivot(index='student',columns='subject',values='score')
    
    • columns:需要转成列的字段
    • values: 需要转成列的值

    5.2 列转行

    image.png
    image.png
    image.png

    6. 排序和频率

    6.1 给指定字段排序

    • 根据教育程度升序排列
    
    df.sort_values(by='education',ascending = False)
    
    • 根据教育程序升序,根据年龄降序,对应
    df.sort_values(by=['education','age'],ascending = [False,True])
    
    image.png

    6.2取到排序后的表添加新的排序

    按照分数降序排列,给排序好的表添加一个rank从第一名到最后一名

    df.sort_values(by='score',ascending = False,inplace=True)
    df['rank']= df['score'].rank(method='first',ascending=False)
    df
    
    image.png

    6.3 统计次数

    • 统计education的频率
    df['education'].value_counts()
    >>>
    1.0    1720
    2.0    1253
    3.0     687
    4.0     473
    Name: education, dtype: int64
    
    • 转换为百分比
    df['education'].value_counts(normalize=True)
    >>>
    1.0    0.416163
    2.0    0.303170
    3.0    0.166223
    4.0    0.114445
    

    7.将函数作用在行和列

    7.1 apply 处理整行和整列

    • 找出所有列的极差
      axis =0 对列进行操作 axis=1对行进行操作
    df.apply(lambda x:x.max()-x.min())
    
    image.png
    • 找出所有列的最大值
    df.apply(lambda x:x.max())
    
    image.png

    7.2 applymap 对表进行操作

    • 将全表的小数转为两位
    df.applymap(lambda x:'%.2f'%x)
    
    image.png

    7.3 map对单独的行进行操作

    • 将totChol这行的数据转为2为小数
    df['totChol'].map(lambda x:'%.2f'%x)
    
    image.png

    8.异常值

    8查找异常值

    8.1.1直接指定范围

    • 找出年龄小于0的数据
    df[df["age"]<0]
    
    • 找出totChol大于500的dataframe
    df[df["totChol"]>500]
    
    image.png

    8.1.2 绝对值查找

    import numpy as np
    
    df[np.abs(df["totChol"])>500]
    

    8.1.3 散点图查找

    构建一个年龄为横坐标,totChol为纵坐标的离散图

    plt.scatter(df["age"],df["totChol"])
    plt.show()
    
    image.png

    3.1.4 箱线图查找

    9. 重复值

    9.1 查找表中重复值

    df[df.duplicated()]
    

    9.1.1 删除重复值

    • 无条件删除,将完全相同的列进行去重
    df.drop_duplicates()
    
    
    • 指定字段删除,对user_id分组去重
    df.drop_dupliates(['user_id')])
    
    • 直接在原来的表中生效
    dr.drop_duplicates(keep=False, inplace=True)
    

    相关文章

      网友评论

          本文标题:Pandas3.1(基本操作)

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