# pandas 其实就是numpy 和matplotlib 结合而成 # pandas 有两个数据结构分别是 Series (一维数组结构) 和dataframe 二维表 行索引,也有列索引 这两个都是带有索引的 可以通过索引访问数据而不是简单的下标访问 都是numpy数组演变而来 # pandas 不在局限于数字处理 字符串也可以 # series 用 name 和 index 属性来描述数据值。Series 是一维数据结构,因此其维数不可以改变 相当于二维的一列 # dataframe DataFrame 是一种二维表格型数据的结构,既有行索引,也有列索引。行索引是 index,列索引是 columns。 在创建该结构时,可以指定相应的索引值 行索引可以省略默认为0123 列索引省略后会随机生成不建议省略 import pandas as pd import numpy as np # pandas.Series(data,index,dtype) data传入的是np数组或列表或者字典 index 传入是索引列表 会自动按顺序加索引 # data:一组数据(ndarray 类型) # index:数据索引标签,如果不指定,默认从 0 开始 # dtype:数据类型,默认会自己判断 # copy:表示对 data 进行拷贝,默认为 False # 创建空的对象 series1=pd.Series() # list创建 series2=pd.Series(["y","w","j"]) # print(series2) # np创建 和索引指定 data1=np.array(["cxk","cln","wy"]) series3=pd.Series(data1,index=["a","b","c"]) # print(series3) # 字典创建 Series 对象 会自动的把key当为索引 series4=pd.Series({"name":"张三","age":"18","sex":"man"}) # print(series4) # 用标量创建 就只有一行标量的数据 如果index数组有多个 会创建多行但每一行都是标量 series5=pd.Series(5,index=["number","age","sex"]) # print(series5) # 访问 Series 数据 series[]里面+索引 # print(series3["a"]) # Series 常用属性 # axes 以列表的形式返回所有行索引标签 # dtype 返回对象的数据类型 # empty 返回一个布尔值,用于判断数据对象是否为空 # ndim 返回输入数据的维数 # size 返回输入数据的元素数量 # values 以 ndarray 的形式返回 Series 对象 纯数据不包括索引 # index 返回一个RangeIndex对象,用来描述索引的取值范围 索引所有可能的值 # print(series4.axes) # print(series4.dtype) # print(series4.empty) # print(series4.ndim) # print(series4.size) # print(series4.values) # print(series4.index) # Series 常用方法 # head() 和 tail() # 查看 Series 的某一部分数据,使用 head() 或者 tail() 方法。其中 head() 返回前 n 行数据,默认显示前5 行数据,tail() 返回后 n 行数据,默认为后 5 行 series6=pd.Series(["a","b","c","d","e","f",None]) # print(series6.head(3)) # print(series6.tail(3)) # isnull() 和 nonull() # 可以做过滤器 # isnull() 和 nonull() 用于检测 Series、DataFrame 中的缺失值。所谓缺失值,顾名思义就是值不存在、丢失、缺少 # isnull():如果为值不存在或者缺失,则返回 True # notnull():如果值不存在或者缺失,则返回 False # print(series6.isnull()) # print(series6[series6.isnull()==False]) # DataFrame # DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示: # name age # 0 "ywj" 18 # 1 "cxk" 23 # 2 "fdg" 12 # DataFrame 的每一行数据都可以看成一个 Series 结构,只不过,DataFrame 为这些行中每个数据值增加了一个列标签 # 同 Series 一样,DataFrame 自带行标签索引,默认为“隐式索引”即从 0 开始依次递增,行标签与DataFrame 中的数据项一一对应当然你也可以用“显式索引”的方式来设置行标签 # pd.DataFrame( data, index, columns,dtype, copy) data应该为一个二维的数据 构成一个矩阵 # data:一组数据(ndarray、series, map, lists,dict 等类型) # index:索引值,或者可以称为行标签 # coumns:列标签,默认为 RangeIndex (0, 1, 2,…, n) # dtype:数据类型 # copy:默认为 False,表示复制数据 data # 创建空对象 data_frame1=pd.DataFrame() # 如果传入的是一个一维数组 就是一列 如果传入的是二维数据 那么第二维的数据就应该是按行排 而不是列 列数为每一个的第二维数据的元素个数 # 列表创建 二维数据有一组有个数据缺项的会自动为NaN data_frame2=pd.DataFrame([["张三",15],["李四",16],["王五",18]],columns=["name","age"]) # print(data_frame2) # 列表嵌套字典创建 DataFrame 对象 列名就自动获取了 key data_frame3=pd.DataFrame([{"name": "张三", "age":13},{"name": "李四", "age":14},{"name": "王五", "age":18}]) # print(data_frame3) # 字典创建 DataFrame 对象 字典的value为list data_frame4=pd.DataFrame({"name":["张三","李四","王五"],"age":[13,15,16]}) # print(data_frame4) # Series 创建 DataFrame 对象 传的参数为Series 每一个传入的Series都是一列 传入的时候用字典的方法传嵌套列表有问题 每一个Series都是一列 即他们可以有一个列名 列名为key Series为value data2=np.array(["张三","李四","王五"]) data3=np.array([15,14,18]) series7=pd.Series(data2) series8=pd.Series(data3) data_frame5=pd.DataFrame({"name":series7, "age":series8}) # print(data_frame5) # 列索引操作 # DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作 # 选取数据 data_frame["列索引"] 取出列 类型为series # print(data_frame2["name"]) # 添加数据 # 添加新列 跟字典添加新元素差不多 data_frame["列名"]=[] 这种方法添加的数据个数要和 行数相同 不然报错 np数组也一样 data_frame4["address"]=["成都","广州","烟台"] # print(data_frame4) # 以Series的方法添加的数据 可以缺项 data_frame4["number"]=pd.Series([123,12412]) # print(data_frame4) # 在指定的位置插入新列 data_frame方法 data_frame.insert(loc,column,value) 在loc前面插入 # 使用insert方法在指定位置插入新列,参数: # loc: 插入位置的列索引。 # column: 新列的名称。 # value: 要插入的 Series。 data_frame4.insert(1,"psd",pd.Series(["123455","25711"])) # print(data_frame4) # 修改某一列的值 跟字典一样 进行赋值的覆盖 # 删除 del关键字可以用 # 通过drop方法删除 DataFrame 中的数据,默认情况下,drop() 不会修改原 DataFrame,而是返回一个新的 DataFrame。 # DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None,inplace=False, errors='raise') # 参数: # 1. labels: # 类型:单个标签或列表。 # 描述:要删除的行或列的标签。如果 axis=0,则 labels 表示行标签;如果 axis=1,则 labels # 表示列标签。 # 2. axis: # 类型:整数或字符串,默认为 0。 # 描述:指定删除的方向。axis=0 或 axis='index' 表示删除行,axis=1 或 axis='columns' 表示 # 删除列。 # 3. index: # 类型:单个标签或列表,默认为 None。 # 描述:要删除的行的标签。如果指定,则忽略 labels 参数。 # 4. columns: # 类型:单个标签或列表,默认为 None。 # 描述:要删除的列的标签。如果指定,则忽略 labels 参数。 # 5. level: # 类型:整数或级别名称,默认为 None。 # 描述:用于多级索引(MultiIndex),指定要删除的级别。 # 6. inplace: # 类型:布尔值,默认为 False。 # 描述:如果为 True,则直接修改原 DataFrame,而不是返回一个新的 DataFrame。 # 7. errors: # 类型:字符串,默认为 'raise'。 # 描述:指定如何处理不存在的标签。'raise' 表示抛出错误,'ignore' 表示忽略错误。 # 列删除 # 方法1 columns属性 index属性 data_frame6=data_frame4.drop(columns=["psd","number"],errors="ignore") # print(data_frame6) # 方法2 axis和labels data_frame7=data_frame4.drop(["psd","number"],axis=1) # print(data_frame7) # 行操作 # loc 选取数据 既可以行操作也可以列操作 # df.loc[] 只能使用标签索引,不能使用整数索引 即位置。当通过标签索引的切片方式来筛选数据时,它的取值前闭后闭,也就是只包括边界值标签(开始和结束) # loc方法返回的数据类型: # 1.如果选择单行或单列,返回的数据类型为Series # 2.选择多行或多列,返回的数据类型为DataFrame # 3.选择单个元素(某行某列对应的值),返回的数据类型为该元素的原始数据类型(如整数、浮点数等)。 # DataFrame.loc[row_indexer, column_indexer] []里面为两个列表 前一个代表行 后一个为列 如果缺省则只对一个进行操作 列表里面输入什么就读什么 如果都输入就两个都操作 # 可以用切片的方式取 这个切片会取到末尾 跟序列切片不一样 传参也不用嵌套列表了 反正就只能传2个参数,切片就相当于字典嘛 data_frame8=pd.DataFrame([["李四",15,"广州"],["张三",13,"成都"],["王五",18,"烟台"]],columns=["name","age","address"],index=["第一个人","第二个人","第三个人"]) # 通过列表的方式 # print(data_frame8.loc[["第二个人","第三个人"],["age","address"]]) # 通过切片的方式 不能通过两个切片 操作行和列 # print(data_frame8.loc["第一个人":"第三个人"]) # iloc 选取数据 loc换成了整数传参 # iloc 方法用于基于位置(integer-location based)的索引,即通过行和列的整数位置来选择数据。 几行几列 必须为整数 # DataFrame.iloc[row_indexer, column_indexer] 这个的切片范围不会取到最后一个 # row_indexer:行位置或布尔数组。 # column_indexer:列位置或布尔数组 # print(data_frame8.iloc[[0,2],[1,2]]) # print(data_frame8.iloc[0:3]) # 切片多行选取 直接切片法 但是这个只能切片 不能列表传参访问 # 通过切片的方式进行多行数据的选取 切片获取行和通过iloc方法获取行从结果上没有区别,切片是基于位置的切片操作,iloc是基于位置的索引操作。 # print(data_frame8[0:2]) # data_frame8[] 传入的是索引的话默认为列索引 切片为行切片 单数字不可以 """# 添加数据行 dataframe方法 # _append() 方法用于将一个 Series 或 DataFrame 追加到另一个 DataFrame 的末尾 只能dataframe用 # DataFrame._append(other, ignore_index=False, verify_integrity=False, sort=False) # 参数: # 1. other: # 类型:Series 或 DataFrame。 # 描述:要追加的数据。 # 2. ignore_index: # 类型:布尔值,默认为 False。 # 描述:如果为 True,则忽略原 DataFrame 的索引,并生成新的整数索引,索引值默认从0开始。 新加的数据索引从0开始 # 3. verify_integrity: # 类型:布尔值,默认为 False。 # 描述:如果为 True,则在创建具有重复索引的 DataFrame 时引发 ValueError。 # 4. sort: # 类型:布尔值,默认为 False。 # 描述:如果为 True,则在追加之前对列进行排序。 # 添加 data_frame8._append(pd.Series(["赵六",20,"深圳"],ignore_index=True)) print(data_frame8)""" # 使用loc[]方法添加新行 df方法 # 使用loc[] 传入一个行index 或者列index 在进行赋值 重复赋值会覆盖(修改) 不能缺项 以Series可以缺项 data_frame8.loc["第四个人"]=["赵六",21,"深圳"] # print(data_frame8) # 删除数据行 同上面的drop # 常用属性和方法 # T 行和列转置。 # axes 返回一个仅以行轴标签和列轴标签为成员的列表。 # dtypes 返回每列数据的数据类型。 # empty DataFrame中没有数据或者任意坐标轴的长度为0,则返回True。 # ndim 轴的数量,也指数组的维数。 # shape 返回一个元组,表示了 DataFrame 维度。 # size DataFrame中的元素数量。 # values 使用 numpy 数组表示 DataFrame 中的元素值。 # head() 返回前 n 行数据。 # tail() 返回后 n 行数据 # print(data_frame8.T) # print(data_frame8.axes) # print(data_frame8.dtypes) # print(data_frame8.values) # 常用的统计学函数 对列进行操作 # count() 统计某个非空值的数量 各个列里面非空的元素个数 # sum() 求和 # mean() 求均值 # median() 求中位数 # std() 求标准差 # min() 求最小值 # max() 求最大值 # abs() 求绝对值 # prod() 求所有数值的乘积 data_frame9=pd.DataFrame([[2,3,4,5,6,7],[23,4,55,25,23,27]],columns=["A","B","C","D","E","F"]) # print(data_frame9.count()) # print(data_frame9.mean())