天天看点

Pandas 入门Pandas 入门

Pandas 入门

两个数据类型:series和DataFrame

Series

1. 创建Series对象
import pandas as pd
ser1 = pd.Series(data=[], index=[])
           
2. Series对象的属性
  1. 索引:ser1.index() —> 索引的值: ser1.index.values
  2. 值:ser1.values
  3. 判断是否存在空值:ser1.hasnans —>返回布尔值
  4. 判断系列中数据是否独一无二: ser1.is_unique —>返回布尔值
  5. 判断数据是否单调递增/递减:

    ser1.is_monotonic_increasing / ser1.monotonic_decreasing

3. Series对象的方法
  1. 获取描述性统计信息 —>集中趋势

    求和:ser.sum()

    平均值:ser.mean()

    中位数:ser.median()

    众数:ser.mode()

  2. 获取描述性统计信息 —> 离散趋势
    1. 最大值/最小值: ser.max() / ser.min()
    2. 方差: ser.var()
    3. 标准差:ser.std()
    4. 四分位数:ser.quantile(0.25/0.5/0.75)
  3. 获取多个描述性信息:

    ser.describe()

  4. 去重
    1. —>返回数组对象: ser.unique()
    2. —>返回Series对象:ser.drop_duplicates( keep=first, inplace=False)
      • keep参数:first --> 保留第一次出现的值,

        ​ last -->保留最后一次出现的值,

        ​ False --> 删除有重复出现的值,一个都不留

      • inplace参数:True:就地删除,原序列改变

        ​ False:返回一个新的序列,原序列不变

  5. 去重后元素的个数:

    ser.nunique() — >返回int

  6. 每个元素出现的频次(按频次降序排列)

    ser.values_counts()

4. 空值的处理
  1. 判断空值
    • 判断空值: ser.isnull() —> 返回布尔值(每个值都判断,返回布尔序列)
    • 判断非空值: ser.notnull() —> 返回布尔值(每个值都判断,返回布尔序列)
    • 应用:通过布尔索引筛选非空值:
      • ser(ser.notnull( ) )
  2. 删除空值
    • ser.dropna(inplace = True )
  3. 删除指定数值: ser.drop(index=[0, 1, 2])
  4. 填充空值
    • 填充指定数值:ser.fillna(50)
    • 就近填充:ser.fillna(method=ffill / bfill)
      • method参数:定义填充方式
        • ffill —> 用空值前面的数值填充
        • bfill —> 用空值后面的数值填充
      • ser.fillna(ffill).fillna(bfill) —> 先用前面的值填充,再用后面的值填充
5. 排序
  1. 按索引排序:ser.sort_index(ascending = True)
  2. 按值排序:ser.sort_values(ascending = True)
    • ascending参数:True —> 升序排列(默认)

      ​ False —> 降序排列

  3. Top - N
    • 前N大: ser.nlargest(3) —> 前3大
    • 前N小: ser.nsmallest(3)—> 前3小
6. 映射 —> map()

​ 类似于python中map高阶函数的用法

​ 示例:

ser = pd.Series([40,74,64,54,32])
newser = ser.map(lambda x: x ** 0.5 * 10)
           

​ 实际使用中为避免某些异常值对评估结果的影响,常采用 线性归一化 和 零均值归一化对数据进行处理:

  • 线性归一化:

    X ′ = X i − X m i n X m a x − X m i n X' = \frac{X_i - X_{min}} {X_{max} - X_{min}} X′=Xmax​−Xmin​Xi​−Xmin​​

    x_i为序列中的值,X_max为序列中最大值,X_min为序列中最小值

    用代码实现:

    x_max, x_min = ser1.max(), ser1.min()
    ser1.map(lambda x: (x - x_min) / (x_max - x_min))
               
  • 零均值归一化:

    X ′ = X i − μ σ X' = \frac{X_i - \mu} {\sigma} X′=σXi​−μ​

    x_i为序列中的值,μ为序列平均值,σ为序列中的标准差

    用代码实现:

    μ, σ = ser1.mean(), ser1.std()
    ser1.map(lambda x: (x - μ) / σ)
               
7. 绘图 —> polt()
  1. 补充:对数据进行汇总

    ser.groupby(level= 0/1/2).sum( )

    • level参数:按几级所有进行汇总
  2. 柱状图
    ser1.plot(kind='bar', color=['red','green','blue'])
    plt.xticks(rotation=0)  # 设置x轴标识呈水平方向
    plt.grid(True, alpha=0.5, axis='y', linestyle=':')		# 设置网格线
    plt.show()
    # 参数: kind --> 图表的类型; color --> 图形的颜色
               
  3. 饼状图
    temp.plot(kind='pie', autopct='%.2f%%')
    plt.ylabel('')  
    plt.show()
    # 参数:autopct --> 数据标注
               

DataFrame

1. 创建DataFrame
  1. 读取csv文件创建DataFrame对象
    df = pd.read_csv(
        r'D:\QianFeng.edu\Part5_BI\Day4\files\2018年北京积分落户数据.csv',
        usecols=['name', 'birthday', 'company', 'score'],
        sep=',', 
        encoding='utf-8',
        skiprows = range(1, 11), 
        nrows=10
    )
               
    • 参数:
      • usecols —> 要读取的列名
      • sep —> 指定文件的额分隔符,默认为逗号
      • enconding —> 文件编码方式,默认为utf-8
      • skiprows —> 跳过哪些行不取,为行的具体行号,可以是list或range
      • nrows —> 要取多好行数据
  2. 读取Excel文件创建DataFrame对象
    df = pd.read_excel(
        r'D:\QianFeng.edu\Part5_BI\Day4\files\2020年销售数据.xlsx',
        sheet_name='Sheet1',
        header=0,
        usecols=['销售日期','销售区域','销售渠道','销售数量']
    )
               
    • 参数:
      • sheet_name:要打开的sheet的名字
      • header:指定表头所在的行,默认为0行
      • 其他的与读取CSV文件相同
  3. 通过SQL读取数据库数据创建DataFrame文件
    import pymysql
    
    conn = pymysql.connect(host='', port=3306,
                            user='root', password='123456',
                            database='hrs', charset='utf8mb4')
    
    dept_df = pd.read_sql(
        'select dno as no, dname as name, dloc as location from tb_dept', 
        conn, 
        index_col='no')
               
    • 参数:index——col:指定索引列,不指定则默认添加0,1,2…为索引
  4. DataFrame的相关操作
    1. 查看DataFrame的信息

      df.info( )

    2. 查看DataFrame前 / 后几行

      df.head( ) / df.tail()

    3. 取DataFrame中的列
      • df.[‘ename’] —> df.[列名]
      • 也可通过花式索引的方法取多列:df.loc[ [索引1],[索引1] ] —> emp_df[ [‘ename’, ‘sal’] ]
    4. 取DataFrame中的行
      • df.loc[1359] —> df.loc[索引]
      • 也可通过花式索引的方法取多行:df.loc[ [索引1],[索引1] ] —> emp_df.loc[[1359,5566]]
      • 切片取行:df.loc[1359:3211]
    5. 修改取到的值

      df.loc[1359, ‘ename’] = ‘胡三道’ —> df.loc[索引, 列名] = 值

    6. 给DataFrame添加列

      df [列名] = 值 —> 若值为定值,则会广播给所有行,若为一个序列,则与每一行一一对应

    7. 给DataFrame添加行
      • 添加全部数据

        df.loc[8899] = [‘雷洋’,‘工程师’,7800,20000,10000,20,‘未婚’] — >df .loc[索引] = 包含所有值的序列

      • 添加部分数据,未知的数据为默认用NaN

        df. loc[7799] = {‘ename’:‘王大锤’, ‘mgr’: 3088, ‘sal’: 5000} — > df.loc[索引] = 包含部分值的字典

    8. 删除列

      df.drop(columns = 列名) —> 删除多列,列名为一个序列

    9. 删除行

      df.drop(index = 索引) —> 删除多行,索引为一个序列

    10. 修改表头

      df.rename(columns =包含修改前后列名的字典) --> df.rename(columns={‘ename’:‘姓名’})

    11. 修改DataFrame的行 / 列 顺序

      df. reindex(index / columns = 包含 行 / 列 新顺序的序列) —> df.reindex(columns=[‘ename’,‘job’,‘sal’,‘comm’,‘dno’,‘mgr’,‘婚姻状况’])

    12. 重置索引

      df. reset_index()

    13. 设置索引

      df. set_index( 需设置成索引的列名 )