• 【DW组队学习—动手学数据分析】第一章:第二节pandas基础-课程学习


    复习:数据分析的第一步,加载数据我们已经学习完毕了。当数据展现在我们面前的时候,我们所要做的第一步就是认识他,今天我们要学习的就是了解字段含义以及初步观察数据

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

    1.4 知道你的数据叫什么

    我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?

    开始前导入numpy和pandas

    import numpy as np
    import pandas as pd
    
    • 1
    • 2
    1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]

    Series

    Series是一个一维标记数组,能够保存任何数据类型(整数、字符串、浮点数、Python 对象等)。轴标签统称为index。
    创建系列的基本方法是调用:
    s = pd.Series(data, index=index)

    • 运算

      • s1+s2 #索引相同的元素相加,不同的则补充Nan
      • s * 2 #所有元素 * 2
      • s+1 #所有元素+1
    • 常用方法

      • s.index #查看索引
      • s.values #查看数值
      • s.isnull() #查看为空的,返回布尔型
      • s.notnull()
      • s.sort_index() #按索引排序
      • s.sort_values() #按数值排序
    #写入代码
    #创建Series
    s = pd.Series(['a','b','c','d']) #默认索引
    s
    
    • 1
    • 2
    • 3
    • 4
    0    a
    1    b
    2    c
    3    d
    dtype: object
    
    • 1
    • 2
    • 3
    • 4
    • 5
    s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"]) #指定索引
    s
    
    • 1
    • 2
    a    0.174499
    b    0.826603
    c   -0.504941
    d    1.154826
    e    0.194536
    dtype: float64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    s = pd.Series({"b": 1, "a": 0, "c": 2}) #指定索引
    s
    
    • 1
    • 2
    b    1
    a    0
    c    2
    dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    s = pd.Series(5.0, index=["a", "b", "c", "d", "e"]) #相同值
    s
    
    • 1
    • 2
    a    5.0
    b    5.0
    c    5.0
    d    5.0
    e    5.0
    dtype: float64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    #我们举的例子
    sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
    example_1 = pd.Series(sdata)
    example_1
    
    • 1
    • 2
    • 3
    • 4
    Ohio      35000
    Texas     71000
    Oregon    16000
    Utah       5000
    dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5

    DataFrame

    dataframe是非常常见的一个表格型数据结构,每一列可以是不同的数值类型,有行索引、列索引。提到它就会自然想到Pandas这个包。平常用Python处理xlsx、csv文件,读出来的就是dataframe格式。
    DataFrame 接受多种不同类型的输入:

    • 一维数组、列表、字典或系列的字典
    • 二维 numpy.ndarray
    • 结构化或记录ndarray
    • 一种 Series
    • 其他 DataFrame
    #我们举的例子
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    stateyearpop
    0Ohio20001.5
    1Ohio20011.7
    2Ohio20023.6
    3Nevada20012.4
    4Nevada20022.9
    5Nevada20033.2
    d = {
        "one": pd.Series([1.0, 2.0, 3.0], index=["a", "b", "c"]),
        "two": pd.Series([1.0, 2.0, 3.0, 4.0], index=["a", "b", "c", "d"]),
        "three": pd.Series([1.0, 2.0, 3.0, 5.0], index = ["a", "b", "c", "e"])
    }
    df = pd.DataFrame(d)
    df
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    onetwothree
    a1.01.01.0
    b2.02.02.0
    c3.03.03.0
    dNaN4.0NaN
    eNaNNaN5.0

    【VC小注】
    可以看到,当规定的index数量、名称不一致时,会用NaN补齐表格

    df = pd.DataFrame(d, index = ["b", "a", "e"], columns=["two", "three"])
    df
    
    • 1
    • 2
    twothree
    b2.02.0
    a1.01.0
    eNaN5.0

    【VC小注】
    可以通过规定index、columns选取行/列组成表格

    1.4.2 任务二:根据上节课的方法载入"train.csv"文件
    #写入代码
    data = pd.read_csv("train.csv")
    data.head(5)
    
    • 1
    • 2
    • 3
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
    1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
    2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
    3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
    4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

    也可以加载上一节课保存的"train_chinese.csv"文件。通过翻译版train_chinese.csv熟悉了这个数据集,然后我们对trian.csv来进行操作

    1.4.3 任务三:查看DataFrame数据的每列的名称
    #写入代码
    data.columns
    
    • 1
    • 2
    Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
           'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
          dtype='object')
    
    • 1
    • 2
    • 3
    1.4.4任务四:查看"Cabin"这列的所有值[有多种方法]

    【总结】查看列值的方法:
    法一:df[列名]
    法二:df.列名

    #写入代码
    data["Cabin"].head(5)
    
    • 1
    • 2
    0     NaN
    1     C85
    2     NaN
    3    C123
    4     NaN
    Name: Cabin, dtype: object
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    #写入代码
    data.Cabin.head(5)
    
    • 1
    • 2
    0     NaN
    1     C85
    2     NaN
    3    C123
    4     NaN
    Name: Cabin, dtype: object
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除

    经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去

    #写入代码
    df_test = pd.read_csv("test_1.csv")
    df_test.columns
    
    • 1
    • 2
    • 3
    Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
           'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked', 'a'],
          dtype='object')
    
    • 1
    • 2
    • 3

    【总结】删除列:
    法一:del df[列名]
    法二:df.columns.delete(删除列的位置),若删除多列用[列1位置,……]
    【注】 该方法不是真的删除了指定列,而是在输出结果上删除了指定列名,指定列数据仍然存在

    #写入代码
    del df_test[ 'a']
    df_test.columns
    
    • 1
    • 2
    • 3
    Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
           'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
          dtype='object')
    
    • 1
    • 2
    • 3
    df_test.columns.delete(-1)
    
    • 1
    Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
           'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
          dtype='object')
    
    • 1
    • 2
    • 3
    df_test.columns
    
    • 1
    Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
           'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked', 'a'],
          dtype='object')
    
    • 1
    • 2
    • 3
    1.4.6 任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素

    从行或列中删除指定的标签,采用以下语句:
    DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)

    #写入代码
    data.drop(columns = ['PassengerId','Name','Age','Ticket'])
    data.head(5)
    
    • 1
    • 2
    • 3
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
    1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
    2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
    3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
    4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

    可以看到,此处依然是全部列数,说明train_data本质并没有发生变化
    drop操作后直接观察可以看到隐藏指定列的数据

    data.drop(columns = ['PassengerId','Name','Age','Ticket']).head(5)
    
    • 1
    SurvivedPclassSexSibSpParchFareCabinEmbarked
    003male107.2500NaNS
    111female1071.2833C85C
    213female007.9250NaNS
    311female1053.1000C123S
    403male008.0500NaNS

    如果想要完全的删除数据,使用inplace=True ,因为使用inplace就将原数据覆盖了

    1.5 筛选的逻辑

    表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。

    下面我们还是用实战来学习pandas这个功能。

    1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。

    df[筛选条件]

    #写入代码
    data[data["Age"]<10].head(5)
    
    • 1
    • 2
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    7803Palsson, Master. Gosta Leonardmale2.03134990921.0750NaNS
    101113Sandstrom, Miss. Marguerite Rutfemale4.011PP 954916.7000G6S
    161703Rice, Master. Eugenemale2.04138265229.1250NaNQ
    242503Palsson, Miss. Torborg Danirafemale8.03134990921.0750NaNS
    434412Laroche, Miss. Simonne Marie Anne Andreefemale3.012SC/Paris 212341.5792NaNC
    1.5.2 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage

    使用 & 表示且

    #写入代码
    midage = data[(data["Age"]>10) & (data["Age"]<50)]
    midage.head(5)
    
    • 1
    • 2
    • 3
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
    1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
    2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
    3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
    4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
    1.5.3 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来

    【总结】索引:
    法一:使用行名和列名,df.loc[[行名], [列名]]
    法二:使用行序和列序,df.iloc[[行索引], [列索引]]

    #写入代码
    midage.loc[100,["Pclass", "Sex"]]
    
    • 1
    • 2
    Pclass         3
    Sex       female
    Name: 100, dtype: object
    
    • 1
    • 2
    • 3

    但是,因为midage是对原表筛选得到的,它的行名依然是原表的行名,即其与现表的索引不一定对应,故要对行索引进行更新,使用如下命令:
    df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=’’)
    其中,drop=True时,覆盖原索引进行更新;drop=False时,将原索引作为表格的一列数据,增加新索引

    midage = midage.reset_index(drop = True)
    midage
    
    • 1
    • 2
    PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
    1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
    2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
    3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
    4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
    .......................................
    57188603Rice, Mrs. William (Margaret Norton)female39.00538265229.1250NaNQ
    57288702Montvila, Rev. Juozasmale27.00021153613.0000NaNS
    57388811Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
    57489011Behr, Mr. Karl Howellmale26.00011136930.0000C148C
    57589103Dooley, Mr. Patrickmale32.0003703767.7500NaNQ

    576 rows × 12 columns

    midage.loc[100,["Pclass","Sex"]]
    
    • 1
    Pclass       2
    Sex       male
    Name: 100, dtype: object
    
    • 1
    • 2
    • 3
    1.5.4 任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
    #写入代码
    midage.loc[[100, 105, 108], ["Pclass", "Name", "Sex"]]
    
    • 1
    • 2
    PclassNameSex
    1002Byles, Rev. Thomas Roussel Davidsmale
    1053Cribb, Mr. John Hatfieldmale
    1083Calic, Mr. Jovomale
    1.5.5 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
    #写入代码
    midage.iloc[[100,105,108],[2,3,4]]
    
    • 1
    • 2
    PclassNameSex
    1002Byles, Rev. Thomas Roussel Davidsmale
    1053Cribb, Mr. John Hatfieldmale
    1083Calic, Mr. Jovomale
  • 相关阅读:
    【三种加载自定义控制器的方式 Objective-C语言】
    基于HMM-Viterbi的通信网络资源数据处理方法及应用
    MOOC——信号报告(5分)
    dolphinscheduler任务莫名重跑
    sql update 不更新
    Redis Cluster Gossip Protocol: Message
    【字符编码系列一】ASCII编码是什么?
    嵌入式mqtt总线架构方案mosquitto+paho
    多对多查询,mybatis使用collection接收集合类型数据
    【java毕业设计】基于java+SSH+jsp的文章发布系统设计与实现(毕业论文+程序源码)——文章发布系统
  • 原文地址:https://blog.csdn.net/sinat_33209811/article/details/126842338