Task01:数据加载及探索性数据分析

读入数据

读入少量数据

  • 查看或修改工作目录
  import os
  os.getcwd()        # 查看当前工作目录current working directory
  os.chdir('路径')    # 修改工作目录,可以将其修改为数据存放位置
  • 读入数据

    • .xlsx数据:pd.read_excel(r"路径",sheet_name)。要注意当有多个sheet时需要设置sheet_name参数,不设置时默认读第一个,None默认读所有,可以时sheet的名字,也可以时sheet的索引(从0开始)。

    • csv文件:pd.read_csv(r"路径",sep),默认分隔符为逗号。

    • tsv文件:pd.read_table(r"路径",sep),默认分隔符为制表符\t。

    • 注意:

      • tsv文件和csv文件:tsv是以制表符\t分隔值,及tab-seperated values,而csv文件则是以逗号分隔,及comma-seperated values。

      • pd.read_table()pd.read_csv()两者的区别也是前者默认分隔符为制表符,后者是逗号,可以通过sep参数修改默认分隔符从而实现相同的效果。

      • 输入路径时,可以r+''或者'\'或者'/'表示。

    • 读入一般的文本文件:打开文件,读取文件内容,关闭文件

         f = open('路径','打开模式')
         f.write('写入内容')
         f.close()
  • 读入数据的路径:相对路径和绝对路径

  • 本次练习

     import numpy as np
     import pandas as pd
     import os
     os.getcwd()            # 查看当前工作目录
     train = pd.read_csv('./train.csv')      # 根据相对路径读入
     test = pd.read_csv("F:/pythondoc/hands-on-data-analysis/第一单元项目集合/test_1.csv")
      # 根据绝对路径读入
     train.head(10)         # 查看前10行数据
     test.tail(10)          # 查看后10行数据
    

读入大量数据

  • 当数据量较大时,pd.read_csv可能会报错memory error,此时可以通过逐块读取解决该问题。同时也方便读取其中的一部分数据或对文件进行逐块处理。

  • 逐块读取方法一:通过设置chunksize参数实现

    chunker = pd.read_csv('./train.csv',chunksize=100)  # 读入数据,每个数据块的大小是100
    print(type(chunker))           # 查看数据类型
    
    chunkcount = 0       # 即分的数据块的个数初始值
    for chunk in chunker:
     print(chunk)
     chunkcount+=1    # 计算分了多少个数据块,如共2000个数据,每个数据块大小为100,则最终是20个数据块,chunkcount=20
    
    print(chunkcount)
    chunker.get_chunk(n)    # 读取大小为n的数据块,多次运行时会从上次读的结束位置继续往下读,而不是从头开始读
    
    • 读取的chunker数据块的类型:TextFileReader,可迭代对象

    • for循环可打印输出每一个数据块,如上所示

    • get_chunk()方法:读取任意大小的块

  • 逐块读取方法二:设置iterator=True实现

    chunker = pd.read_csv('./train.csv',iterator=True)
    chunk = chunker.get_chunk(5)       # 读前5行数据
    chunk = chunker.get_chunk(5)       # 从上一个结束往后再读5个
    
    • 注意:这里是连续读,会从上一次读的结束的继续读

修改DataFrame的列名

  • 方法一:在读入的同时修改names=[列名]参数修改列名

    pd.read_csv('路径',names=['列名1','列名2',...])  # 要写入所有的列名
    
    # 本例中
    train = pd.read_csv('./train.csv',
    names=['乘客ID','是否幸存',
    '乘客等级(1/2/3等舱位)','乘客姓名','性别',
    '年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口'])
    
  • 方法二:df.columns=[列名]进行修改

    df.columns=['列名1','列名2',...]       # 需要输入所有列名
    
    # 本例中
    train.columns = ['乘客ID','是否幸存',
    '乘客等级(1/2/3等舱位)','乘客姓名','性别',
    '年龄','堂兄弟/妹个数','父母与小孩个数',
    '船票信息','票价','客舱','登船港口']
    
  • 方法三:df.renames(columns={'原列名':'新列名'})

    df.renames(columns={'原列名':'新列名',...})   # 只需要输入要修改的列名,不用输入所有
     
     # 本例中,假设只修改乘客ID
     train.renames(columns={'PassengerId','乘客Id'})
    

初步观察数据

观察数据

  • 主要包括:数据大小,行数,列数,各列时什么格式,是否包含null值等

    train.shape                # 数据的行列数
     train.info()               # 查看每一列的数据类型,非空值个数
     train['乘客ID'.dtype]      # 查看某一列数据类型
     train.describe()          # 描述性统计,查看非空值个数,均值,标准差,最大值,最小值,分位数
     train['乘客ID'].astype("float64") # 修改数据类型
    
  • 查看前n行df.head(n)和后n行数据df.tail(n)

     train.head(10)       # 查看前10行数据,默认为5
     train.tail(15)       # 查看后15行数据,默认为5
    
  • 判断数据是否为空df.isnull()若空则返回True

    train.isnull().head()      # 判断数据是否为空并输出前5行
    
  • 保存数据df.to_csv('路径',encoding)

     train.to_csv('train_Chinese',encoding='utf-8')
    
  • 查看数据常用方法

    df.head(n) 查看前n行数据
    df.tail(n) 查看后n行数据
    df.shape 查看行数和列数
    df.info() 查看有哪些列,非空值个数,数据类型
    df.describe() 描述性统计,计数,均值,标准差,最大值最小值,分位数
    df.unique() 查看数据列有哪些分类内容
    Series.value_counts() 查看表格某列中有多少各不同值,并计算每个不同值在该列中有多少重复值。时series拥有的方法,在df中用需要指定某一列,返回的也是series
    df.apply(pd.Series.value_counts) 查看df中每一列的唯一值和计数

Pandas基础

pandas中的两种数据类型

  • Series

    • 特点

      • 一维数组,由数据values和索引index组成

      • 可以简单地看作dataframe中地一列

    • 创建

      • 列表创建,不指定索引:pd.Series([值1,值2,...]),不指定索引时则默认从0开始

      • 列表创建,指定索引:pd.Series([值1,值2,...],index=[index1,index2,...]),输出时第一列为索引,第二列为数据

      • 字典创建:(因为和字典很像)pd.Series({"key1":value1,"key2":value2,...}),创建后key是索引,value是值。此时已经有索引,不能再通过pd.Series(字典,index=[])来指定索引了,这样的效果是和reindex一样,即按照新的Index顺序从数据中取出对应的数据,如果没有这个index则返回NaN。

      • reindex不是改索引的。s1.reindex([1,3,6]),根据索引1.3.6找出s1中对应的值,有则显示,没有则为NaN

      • Series.index=[]是改变index的。

  • DataFrame

    • 一组有序的列,和Excel中的表格很类似,一列必须是同一个类型数据,列于列之间可以是不同类型。类似于多个Series。

    • DataFrame既有行索引也有列索引,自己简化理解是行是Index,列是列名。

    • 构建方法pd.DataFrame('等长字典或numpy')

    ```
    # 方法一:由等长列表组成的字典
     data = {
      "state":['a','n','h','d'],  # state是列名或者说列索引
      'year':[2001,2004,2007,2018],
      'name':['lily','lucy','tom','tony']
     }
     
     frame1 = pd.DataFrame(data)
     frame1 = pd.DataFrame(data,columns=['year','name','state'])   # 指定列的顺序
     # 也可以通过index=[]生成行索引
     
     
     # 通过Numpy创建
     data2 = np.random.randn(6,4)
     frame2 = pd.DataFrame(data2,columns=list('ABCD'))
    ```

DataFrame数据的基础操作

  • 查看某列的值

    • df.列名

    • df['列名']

  • 删除某列

    • del df['列名']:直接从数据中永久删除

    • df.drop(labels=None,axis=0,index=None,columns=None,inplace=False)

      • labels:要删除的行或列的名字,用列表给定

      • axis:默认为0,删除行;若要删除列,则需要指定axis=1

      • index:直接指定要删除的行

      • columns:直接指定要删除的列

      • inplace默认为False,不改变原数据,返回一个新的数据框,true则直接在原数据上修改。

      • 所以删除有两种方式,①labels=None,axis=0的组合,此时若输入一个列名而axis=0则会报错;②index或column直接指定要删除的行或列

  • 本例中

     # 方法一:直接用columns列名删除/index行索引删除
     test.drop(columns='a')
     
     # 方法二:用labels名字+axis删除
     test.drop(labels='a',axis=1)
     
     # 方法三:del永久删除
     del test['a']
    

筛选数据

类型 说明
df[val] 选取一列或一组列;布尔型过滤符合条件的列;切片选行
df.loc[val] 通过标签,选择df中的单个行或一组行
df.loc[:,val] 通过标签,选取单列或一组列
df.loc[val1,val2] 通过标签,同时选取行和列
df.iloc[where] 通过整数位置,从df中选取单个行或行子集
df.iloc[:,where] 通过整数位置,从df中选取单个列或列子集
df.iloc[where_i,where_j] 通过整数位置,同时选取行和列
reindex 通过标签选取行或列
  • df[val]的用法

    • 选取一列:df[列名1]

    • 选取一组列:df[[列名1,列名2,...]]

    • 布尔型过滤符合条件的行:df[df.列名>值],交&并|

    • 切片选行:df[:3]即前3行数据,不能写成df[0,1,2]会报错,只能写一个值,如df[[0,1,2]]但此时是找列名为0,1,2的列

  • iloc和loc的不同

    • iloc是通过整数位置来选取,即interger location

    • loc是通过标签选取

  • 本例中

    # 显示年龄在10岁以下的乘客信息
    train[train.Age<10].head()
    
    # 显示奈年龄在10岁以上和50岁以下的乘客信息
    midage = train[(train.Age>10) & (train.Age<50)]
    midage.head(30)
    
  • reset_index()

    • 具体参考:reset_index()

    • 作用:

      • 重置dataframe的索引,并使用默认索引。即如果原来设置了别的索引,会改为默认索引

      • 若原来有多个索引,比如有两/多列数据都是行索引,则可以删除一个或多个行索引级别,让行索引变成列

    • 语法:reset_index(level=None,drop=False,inplace=False,col_level=0,col_fill="")

  • 本例中

    # 任务四:将上述通过年龄筛选到的midage的第100行的Pclass和Sex数据提取出来
    # 从midage的输出结果中可以看到其index是不连续的还是train的index
    # 所以必须reindex()来重置索引才可以渠道midage的第100行数据
    midage = midage.reset_index(drop=True)  # 即重置索引,且删掉原来的索引
    midage.loc[[100],['Pclass','Sex']]   # 实际上取到的是第101行数据,因为索引是从0开始的
    
    
    # 任务五:使用iloc方法将midage中第100,105,108行的Pclass,Name,Sex
    midage.iloc[[100,105,108],[2,3,4]]
    

探索性数据分析

DataFrame排序

按行索引升序排序 df.sort_index()默认行,默认升序
按列索引升序排序 df.sort_index(axis=1)
按列索引降序排序 df.sort_index(axis=1,ascending=False)
按列的值升序排序 df.sort_values(by=[列1,列2,...])
  • 本例中

    # 按票价和年龄两列降序排列
     train.sorted = train.sort_values(by=['票价','年龄'],ascending=False)
    
    • 结果中发现票价越高,存活的人数越多,票价前20中存活的有14个人。所以为后续分析提供了基础,票价和是否存活是高度相关的。

DataFrame相加

  • 语法:df1+df2

    • 对应的行和列,即行索引和列名称相同的相加,没有对应值的会变成空值NaN

其他运算

  • 本例中

    # 计算穿上最大的家族有多少人
    max(train['堂兄弟/妹个数']+train['父母与小孩个数'])
    
    # 基本统计信息,这个之前已经总结过使用describe()
    train.describe()
    
    # 票价,父母子nv的基本统计数据
    train['票价'],describe()
    train['父母与小孩个数'].describe()
    
    • 主要就是对计数,平均值,标准差,分位数进行分析。

    • 以票价为例:一共有891个非空票价数据,均值为32.2元,标准差为49、69,说明票价的波动是很大的,一方面也反映了坐船人的经济差距。最大值是512.33,最小值为0.

你可能感兴趣的:(Task01:数据加载及探索性数据分析)