0%

python-pandas-DataFrame对象

python-pandas-DataFrame对象

DataFrame由按一定顺序排列的多列数据组成,各列数据类型可以有所不同(数值,字符串或布尔值等)

image-20220915170248341

DataFrame有两个索引数组。第一个数组与行相关,它与Series的索引数组极为相似,每个标签与标签所在行的所有元素相关联。而第二个数组包含一系列列标签,每个标签与一列数据相关联。

  1. 定义DataFrame对象

    新建DataFrame对象的最常用方法是传递一个dict对象给DataFrame()构造函数。dict对象以每一列的名称作为键,每个键都有一个数组作为值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    data = {'color':['blue','green','yellow', 'red','white'],'object':['ball','pen','pencil','paper','mug'],'price': [1.2,1.0,0.6,0.9,1.7]}
    frame = pd.DataFrame(data)
    frame
    # color object price
    # 0 blue ball 1.2
    # 1 green pen 1.0
    # 2 yellow pencil 0.6
    # 3 red paper 0.9
    # 4 white mug 1.7

    如果用来创建DataFrame对象的dict对象包含一些用不到的数据,你可以只选择自己感兴趣的。在DataFrame构造函数中,用columns选项指定需要的列即可。新建的DataFrame各列顺序与你指定的列顺序一致,而与它们在字典中的顺序无关。

    1
    2
    frame = pd.DataFrame(data,colums=['object','price'])
    frame

    DataFrame对象跟Series一样,如果Index数组没有明确指定标签,pandas也会自动为其添加一列从0开始的数值作为索引。如果想用标签作为DataFrame的索引,则要把标签放到数组中,赋给index选项。

    1
    frame2 = pd.DataFrame(data,index=[ 'one' , ' two ' , 'three' , 'four' , 'five'])

    定义一个构造函数,指定三个参数,参数顺序如下:数据矩阵、index选项和columns选项。记得将存放有标签的数组赋给index选项,将存放有列名称的数组赋给columns选项。

    1
    2
    3
    4
    5
    6
    frame3 = pd.DataFrame(np.arange(16).reshape((4,4)),index=['red','blue','yellow','white'],columns=[ 'ball','pen','pencil', 'paper'])
    # ball pen pencil paper
    # red 0 1 2 3
    # blue 4 5 6 7
    # yellow 8 9 10 11
    # white 12 13 14 15
  2. 选取元素

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 获取DataFrame对象所有列的名称
    frame.columns
    # 获取索引列表
    frame.index
    # 获取存储在数据结构中的元素
    frame.values
    # 获取某一列的内容
    frame[列名]=frame.price
    # 用ix属性和行的索引值就能获取到,返回结果同样是一个Series对象,其中列的名称已经变为索引数组的标签,而列中的元素变为Series的数据部分
    frame.ix[x]
    #多行索引
    frame.ix[[2,4]]
    frame[0:3]
    # 获取某一个元素
    frame['object'][3]
  3. 赋值

    一旦你理解了组成DataFrame的各元素的获取方法,依照相同的逻辑就能增加或修改元素。

    用index属性指定DataFrame结构中的索引数组,用columns属性指定包含列名称的行。你还可以用name属性为这两个二级结构指定标签,便于识别。

    1
    frame.index.name = 'id'; frame.columns.name = 'item'
  4. 元素的所属关系

    利用isin()函数判断一组元素是否属于DataFrame对象

    得到一个只包含布尔值的DataFrame对象,其中只有满足从属关系之处元素为True。如把上述返回结果作为条件,将得到一个新DataFrame,其中只包含满足条件的元素。

    1
    2
    frame.isin([1.0,'pen'])
    frame[frame.isin([1.0,'pen'])]
  5. 删除一列

    如想删除一整列的所有数据,使用del命令。

    1
    del frame['new']
  6. 筛选

    同series对象,不符合条件的元素会被替换为NaN

    1
    frame[frame < 12]
  7. 用嵌套字典生成DataFrame对象

    直接将嵌套字典作为参数传递给DataFrame()构造函数, pandas就会将外部的键解释成列名称,将内部的键解释为用作索引的标签。

    1
    2
    3
    4
    5
    6
    nestdict = {'red':{2012:22,2013:33},'white':{2011:13,2012: 22,2013:16},'blue': {2011:17,2012: 27,2013:18}}
    frame2 = pd.DataFrame(nestdict)
    # red white blue
    # 2012 22.0 22 27
    # 2013 33.0 16 18
    # 2011 NaN 13 17

    解释嵌套结构时,可能并非所有位置都有相应的元素存在。pandas会用NaN填补缺失的元素。

  8. DataFrame转置

    处理列表数据时可能会用到转置操作(列变为行,行变为列)。pandas提供了一种很简单的转置方法。调用T属性就能得到DataFrame对象的转置形式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    frame3 = pd.DataFrame(np.arange(16).reshape((4,4)),index=['red','blue','yellow','white'],columns=[ 'ball','pen','pencil', 'paper'])
    print(frame3)
    print(frame3.T)
    # ball pen pencil paper
    # red 0 1 2 3
    # blue 4 5 6 7
    # yellow 8 9 10 11
    # white 12 13 14 15
    # red blue yellow white
    # ball 0 4 8 12
    # pen 1 5 9 13
    # pencil 2 6 10 14
    # paper 3 7 11 15