Pandas 基本操作

Pandas基本操作

简介

  1. 表格数据操作(增删改查)
  2. 实现多个表格的处理
  3. 数据清洗操作:缺失值,重复值,异常值,数据标准化,数据转化的操作
  4. 实现excel的特殊操作:生成透视表,交叉表
  5. 完成统计分析

一:构建dataframe

dataframe同时拥有行索引和列索引,所以它是二维的

导入模块

import pandas as pd

构建dataframe方法一

columns:列索引

index:行索引,可以不写,会自动以数字补全

data:表格中的值

df1 = pd.DataFrame(data=[["kid",20,"男","it"],["hacker",23,"男","skate"],["hero",4,"女","games"]], index=["a","b","c"],columns=["姓>名","年龄","性别","爱好"])
print(df1)

# 结果
      姓名  年龄 性别     爱好  
a     kid  20  男     it    
b  hacker  23  男  skate     
c    hero   4  女  games     

构建dataframe方法二

以键值对方式创建

df2 = pd.DataFrame(data={"姓名":["gboy","bgril"],"年龄":[29,18],"性
别":["男","女"],"weight":[127,98]})
print(df2)

# 结果
      姓名  年龄 性别  weight
0   gboy  29  男     127
1  bgril  18  女      98

二:dataframe属性

  1. shape

    结构

    print(df1.shape)
    
    # 结果
    (3, 4)
    
  2. ndim

    维度

    print(df1.ndim)
    
    # 结果
    2
    
  3. size

    元素个数

    print(df1.size)
    
    # 结果
    12
    
  4. dtypes

    元素类型,查看每一列数据的类型

    print(df1.dtypes)
    
    # 结果
    姓名    object
    年龄     int64
    性别    object
    爱好    object
    dtype: object
    
  5. columns

    查看列索引

    print(df1.columns)
    
    # 结果
    Index(['姓名', '年龄', '性别', '爱好'], dtype='object')
    
  6. index

    查看行索引

    print(df1.index)
    
    # 结果
    Index(['a', 'b', 'c'], dtype='object')
    
  7. values

    查看元素,返回的是一个数组类型

    print(df1.values)
    
    # 结果
    [['kid' 20 '男' 'it']
     ['hacker' 23 '男' 'skate']
     ['hero' 4 '女' 'games']]
    

三:查找方法

  1. 一维切片

    返回的是series类型,series是一维类型,只有一个轴

    仅限于取一列的值,切多列值时需传入一个列表

    print(df1["姓名"])
    
    # 结果
    a       kid
    b    hacker
    c      hero
    Name: 姓名, dtype: object
    
    
  2. 二维切片

    切多列值,返回的是frame类型,frame是一个二维类型,有两个轴

    print(df1[["姓名","年龄"]])
    
    # 结果
           姓名  年龄
    a     kid  20
    b  hacker  23
    c    hero   4
    

    取某一行

    只能进行正序切片,后序切片即[:-1]的写法是错误的

    df1[["姓名","年龄"]][:2]
    
    # 结果
           姓名  年龄
    a     kid  20
    b  hacker  23
    
  3. 索引切片

    loc[行索引名称/条件, 列的索引名称]

    如果loc[]中有一个[]或没有[]则得到一维类型,如果loc[]中有两个[]则得到二维类型

    • 切出单个值,得到的为一维类型
    print(df1.loc["a","姓名"])
    
    • 单行切分,得到的为一维类型
    print(df1.loc["a",:])
    
    # 结果
    姓名    kid
    年龄     20
    性别      男
    爱好     it
    Name: a, dtype: object
    
    • 多行切分,得到的为二维类型
    print(df1.loc[["a","b"],["姓名","年龄"]])
    
    # 结果
           姓名  年龄
    a     kid  20
    b  hacker  23
    
  4. 条件切分

    这里的:b是指从头开始取,取到行索引为3的值停止,所以使用条件切分时要注意打乱顺序的表格取值,取值为前闭后闭

    print(df1.loc[:"b","姓名"])
    
    # 结果
    a       kid
    b    hacker
    Name: 姓名, dtype: object
    
  5. 条件取值

    例:获取年龄大于18岁的男同学的姓名和爱好

    位运算(对位运算):& 和 |,&表示和,|表示或

    mask1 = df1["年龄"] > 18
    mask2 = df1["性别"] == "男"
    mask = mask1 & mask2
    print(df1.loc[mask,["姓名","爱好"]])
    
    # 结果
           姓名     爱好
    a     kid     it
    b  hacker  skate
    
  6. iloc取值(不常用)

    按索引取值

    # 取最后一行
    print(df1.iloc[-1,:])
    
    # 结果
    姓名     hero
    年龄        4
    性别        女
    爱好    games
    Name: c, dtype: object
    

四:增加方法

  1. 增加一列

    如果没有这一列则添加,如果有这一列则覆盖。如果只赋值一个元素则会先进行广播,然后再增加。

    # 为每个人添加身高
    df1["height"] = [178,167,181]
    print(df1)
    
    # 结果
          姓名  年龄 性别     爱好  height
    a     kid  20  男     it     178
    b  hacker  23  男  skate     167
    c    hero   4  女  games     181
    
  2. append

    增加行数

    原表并不会改变,而是在增加后返回一个新表

    ​ 增加行数时,列索引会取两个表的交集,元素不存在的地方则用NaN填充,行索引为两个表的行索引

    df3 = df1.append(df2)
    print(df3)
    
    # 结果
           姓名  年龄 性别     爱好  height  weight
    a     kid  20  男     it   178.0     NaN
    b  hacker  23  男  skate   167.0     NaN
    c    hero   4  女  games   181.0     NaN
    0    gboy  29  男    NaN     NaN   127.0
    1   bgril  18  女    NaN     NaN    98.0
    

    ignore_index=True:表示忽略原始行索引,重新设置行索引

    df4 = df1.append(df2,ignore_index=True)
    print(df4)
    
    # 结果
           姓名  年龄 性别     爱好  height  weight
    0     kid  20  男     it   178.0     NaN
    1  hacker  23  男  skate   167.0     NaN
    2    hero   4  女  games   181.0     NaN
    3    gboy  29  男    NaN     NaN   127.0
    4   bgril  18  女    NaN     NaN    98.0
    

五:删除方法

drop

labels:要删除的列/行索引

  1. 删除指定列

​ 不会在原表上进行修改,会放回一个新表,如果想将修改直接反映在原表中,则需指定参数:inplace=True

print(df4.drop(labels=["height","weight"],axis=1))

# 结果
       姓名  年龄 性别     爱好
0     kid  20  男     it
1  hacker  23  男  skate
2    hero   4  女  games
3    gboy  29  男    NaN
4   bgril  18  女    NaN
  1. 删除指定行
print(df4.drop(labels=[3],axis=0))

# 结果
       姓名  年龄 性别     爱好  height  weight
0     kid  20  男     it   178.0     NaN
1  hacker  23  男  skate   167.0     NaN
2    hero   4  女  games   181.0     NaN
3    gboy  29  男    NaN     NaN   127.0

六:修改方法

先将要修改的值查出来,然后再修改

例:将名字为"hacker"的人的性别改为"女"

df1.loc[df1["姓名"]=="hacker","性别"] = "女"
print(df1)

# 结果
       姓名  年龄 性别     爱好  height
a     kid  20  男     it     178
b  hacker  23  女  skate     167
c    hero   4  女  games     181

七:统计方法

  1. 沿用numpy中的10个统计分析方法,可翻看以前博客,这里不做讲解

    补充:极差,最大值与最小值差

    np.ptp(df1["年龄"])
    
  2. pandas中的方法

    • 针对series类型,即一维类型

      二维类型的方法一维都能使用,一维的方法二维不一定能够使用

      将numpy的方法转换为pandas的方法,写法如下

      # 取某一列的最小数
      print(df1["年龄"].min())  # --> 4
      # 取标准差
      print(df1["年龄"].std())  # --> 10.214368964029708
      # 取最大值索引
      print(df1["年龄"].argmax())  # --> 1
      ...
      

      补充方法:

      众数,出现次数最多的数

      print(df1["年龄"].mode())
      
      # 结果
      0     4
      1    20
      2    23
      dtype: int64
      

      非空数

      print(df1["年龄"].count() )
      
      # 结果
      3
      

      频数统计,一维特有方法

      print(df1["年龄"].value_counts())  
      
      # 结果
      20    1
      4     1
      23    1
      Name: 年龄, dtype: int64
      
    • df类型方法

      取最小数

      取出的是每一列的最小值,字符串按照编码排序,得到的为一维类型

      print(df1.min())
      
      姓名        hacker
      年龄             4
      性别             女
      爱好         games
      height       167
      dtype: object
      

      最大值索引,横向比较

      print(df2[["年龄","weight"]].idxmax(axis=1))
      
      # 结果
      0    weight
      1    weight
      dtype: object
      

      最大值索引比较,纵向比较

      print(df2[["年龄","weight"]].idxmax(axis=0))
      
      # 结果
      年龄        0
      weight    0
      dtype: int64
      

      众数

      每一列中,只显示众数,其它位置都用NaN补充

      print(df1.mode())
      
      # 结果
             姓名  年龄   性别     爱好  height
      0  hacker   4    女  games     167
      1    hero  20  NaN     it     178
      2     kid  23  NaN  skate     181
      

      描述

      • 整数类型,如果字符串类型与整数类型混用,则只返回整数类型的描述
      print(df1["年龄"].describe())
      
      # 结果
                    年龄
      count   3.000000
      mean   15.666667
      std    10.214369
      min     4.000000
      25%    12.000000
      50%    20.000000
      75%    21.500000
      max    23.000000
      
      
      • 字符串类型

        count:非空数目
        unique:去重之后又几个值
        top:众数
        freq:众数出现的频数

      print(df1["性别"].describe())
      
      # 结果
      count     3
      unique    2
      top       女
      freq      2
      Name: 性别, dtype: object
      

附:补充
一维series构建
pd.Series(data=[“lx”,“ss”,“zs”],index=[0,1,2])

你可能感兴趣的:(DataAnalysis,python,数据分析,pandas)