datawhale-动手学数据分析task1笔记

动手学数据分析task1

第一节:数据载入及初步观察

载入数据

  1. 数据集下载

  2. 导入numpy库和pandas库。

    import numpy as np
    import pandas as pd
    
  3. 载入数据。

    • 相对路径载入数据。

      # sep参数指定分隔符,默认是 ,
      df = pd.read_csv('train.csv')
      
    • 绝对路径载入数据。

      path = os.path.abspath('train.csv')
      df = pd.read_csv(path)
      
    • 相关注意与提示。

      • 相对路径载入报错时,os.getcwd()查看当前工作目录。

      • read_csv得到了正确格式的数据,显示以","分割数据的格式。

      • read_table得到了原始格式数据,显示以制表符"\t"分割数据的格式。

      • read_table(path, sep=',')使用参数sep即可做到效果一致。

      • 加载的数据是所有工作的第一步,我们的工作会接触到不同的数据格式(.csv;.tsv;.xlsx),但是加载的方法和思路都是一样的。

      • read_csv返回的是Dataframe或TextParser。
        Dataframe.to_csv可将Dataframe转成csv文件。

  4. 逐块读取。

    df = pd.read_csv('train.csv', chunksize=1000)
    # method1
    for chunk in df:
       print(chunk)
    # method2
    df.get_chunk()
    

    逐块读取是将数据分成小块,并按块读取和处理。
    逐块读取可以有效地处理大型数据,提高处理速度,减少内存使用,提高应对错误能力。

    chunker(数据块)的类型是TextFileReader。
    for循环得到的数据不够美观。

  5. 将表头翻译成中文,索引为乘客ID。

    # columns方法可以写成字典{'a':'A'}
    df.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
    
    # 增添表头method,用names参数,但原表头会变成数据。  
    df = pd.read_csv('train.csv', names=[...])
    
    #  也可通过此方法利用dict完成翻译
    df.rename(columns={dict}, inplace=True)
    

初步观察

  1. 查看数据基本信息。

    print(df.info())
    
    '''
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 891 entries, 0 to 890
    Data columns (total 12 columns):
    #   Column          Non-Null Count  Dtype  
    ---  ------          --------------  -----  
    0   乘客ID            891 non-null    int64  
    1   是否幸存            891 non-null    int64  
    2   乘客等级(1/2/3等舱位)  891 non-null    int64  
    3   乘客姓名            891 non-null    object 
    4   性别              891 non-null    object 
    5   年龄              714 non-null    float64
    6   堂兄弟/妹个数         891 non-null    int64  
    7   父母与小孩个数         891 non-null    int64  
    8   船票信息            891 non-null    object 
    9   票价              891 non-null    float64
    10  客舱              204 non-null    object 
    11  登船港口            889 non-null    object 
    dtypes: float64(2), int64(5), object(5)
    memory usage: 83.7+ KB
    '''
    
    print(df.describe())
    
    '''
             乘客ID     是否幸存     ...  父母与小孩个数    票价
    count  891.000000  891.000000  ...  891.000000  891.000000
    mean   446.000000    0.383838  ...    0.381594   32.204208
    std    257.353842    0.486592  ...    0.806057   49.693429
    min      1.000000    0.000000  ...    0.000000    0.000000
    25%    223.500000    0.000000  ...    0.000000    7.910400
    50%    446.000000    0.000000  ...    0.000000   14.454200
    75%    668.500000    1.000000  ...    0.000000   31.000000
    max    891.000000    1.000000  ...    6.000000  512.329200
    '''
    
  2. 观察表格前10行的数据和后15行的数据。

    # head()和tail()的参数是显示的数量
    df.head(10)
    df.tail(15)
    
  3. 判断数据是否为空,为空的地方返回True,其余地方返回False。

    df.isnull()
    

保存数据

保存并重命名。

df.to_csv('train_chinese.csv')

第二节 pandas基础

了解数据类型

  1. Series是带标签的一维数组,轴标签统称为索引。

  2. Series使用示例,可以使用index参数,也可以使用字典。

    >>> s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
    >>> s
    '''
    输出:
    a   -0.108730
    b   -0.412877
    c   -0.307803
    d   -0.728362
    e   -0.679069
    dtype: float64
    '''
    
    >>> sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
    >>> example_1 = pd.Series(sdata)
    >>>example_1
    '''
    输出:
    Ohio      35000
    Texas     71000
    Oregon    16000
    Utah       5000
    dtype: int64
    '''
    
  3. DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。

  4. DataFrame使用示例。

    >>> d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
    >>> df = pd.DataFrame(d)
    >>> d
    '''
    输出:
        one two
    a   1.0 1.0
    b   2.0 2.0
    c   3.0 3.0
    d   NaN 4.0
    '''
    
    >>> data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
    >>> example_2 = pd.DataFrame(data)
    >>> example_2
    '''
    输出:
        state   year    pop
    0   Ohio    2000    1.5
    1   Ohio    2001    1.7
    2   Ohio    2002    3.6
    3   Nevada  2001    2.4
    4   Nevada  2002    2.9
    5   Nevada  2003    3.2
    '''
    
  5. columns方法可以得到表头的list。

  6. 查看某一列的所有项可以直接df.xxx或利用索引df['xxx'],注意得到的是Series类型,如果想返回DataFrame可以使用嵌套df[['xxx']]

  7. 删除列可以使用deldf.pop('xxx')df.drop(['xxx'] ,axis=1 ,inplace=True)(默认inplace参数是False,结果是生成一个副本,而非本身发生变化,只有True才能改变本身)。

筛选的逻辑

  1. 可直接通过索引比较数据大小,或者通过list的索引获得符合条件的数据序号。

    >>> df['Age'] < 10
    '''
    输出:
    0      False
    1      False
    2      False
    3      False
    4      False
        ...  
    886    False
    887    False
    888    False
    889    False
    890    False
    Name: Age, Length: 891, dtype: bool
    '''
    
    >>> df[df['Age'] < 10]
    '''结果繁琐省略'''
    
    # 交集是& 并集是|
    >>> midage = df[(df['Age'] < 50) & (df['Age'] > 10)]
    '''结果繁琐省略'''
    
  2. 如果需要用选择某行的某些数据,可以使用.loc[[序号行], [column]]方法

    >>> midage.loc[[100], ['Name','Pclass', 'Sex']]
    
    '''
    输出:
        Name                  Pclass Sex
    100 Petranec, Miss. Matilda 3   female
    '''
    

    注意:上面获得的第100行并不是midage中的一百行,而是原数据编号为100的行。

  3. 如果需要获得部分数据新创建的dataframe中的特定行数,需要使用.reset_index()方法,但其原索引会变成一列新的内容,如果需要覆盖原索引,可以增加参数drop=True

  4. 注意一般默认索引开始是0。

  5. iloc[]loc[]最大的不同是iloc[]方法是基于整数位置(真实的索引,而非认为标注的)索引,而.loc[]是基于标签的,而不是基于整数位置的。

探索性数据分析

  1. DaraFrame数据按columns(列)排序可以使用.sort_values()方法,其中参数ascending=True是默认升序排列,axis=0是默认按行排序。

  2. 排序index和columns可以使用.sort_index()方法,其中参数ascending=True是默认升序排列,axis=0是排序indx,axis=1是排序columns。

  3. 如果同时对两个数据进行排序时,无法做到,会优先满足第一个数据(作为参数的)。

  4. 利用Pandas进行算术计算,计算两个DataFrame数据相加时,只有行列都相同的部分才会进行算术计算,剩下的会数据NaN。

  5. 一个DataFrame的不同columns计算就是普通计算。

posted @ 2024-03-12 23:14  LPF05  阅读(27)  评论(0编辑  收藏  举报