DataFrame
DataFrame是一个类似于二维数组或表格(如excel)的对象,它每列的数据可以是不同的数据类型。与Series的结构相似,DataFrame的结构也是由索引和数据组成的,不同的是,DataFrame的索引不仅有行索引,还有列索引,其结构的示意图如图1所示。
图1 DataFrame对象结构示意图
图1展示的是DataFrame结构表现形式,其行索引位于最左边一列,列索引位于最上面一行,并且数据可以有多列。与Series的索引相似,DataFrame的索引也是自动创建的,默认是从0~N的整数类型索引。
Pandas的DataFrame类对象可以使用以下构造方法创建:
pandas.DataFrame(data = None,index = None,columns = None,dtype = None,copy = False)
上述构造方法中常用参数所表示的含义如下:
(1) index:行标签。如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引。
(2) columns:列标签。如果没有传入索引参数,则默认会自动创建一个从0~N的整数索引。
为了能够让读者更好地理解,下面通过一个示例来演示如何创建DataFrame类对象,具体代码如下。
In [8]: import numpy as np
import pandas as pd
demo_arr = np.array([['a', 'b', 'c'], ['d', 'e', 'f']]) # 创建数组
df_obj = pd.DataFrame(demo_arr) # 基于数组创建DataFrame对象
df_obj
Out[8]:
0 1 2
0 a b c
1 d e f
上述示例中,创建了一个2行3列的数组demo_arr,然后通过demo_arr构建了一个DataFrame对象df_obj。从输出结果可以看出,df_obj对象的行索引和列索引都是自动从0开始的。
如果在创建DataFrame类对象时,为其指定了列索引,则DataFrame的列会按照指定索引的顺序进行排列,示例代码如下。
# 创建DataFrame对象,指定列索引
In [9]: df_obj = pd.DataFrame(demo_arr, columns=['No1', 'No2', 'No3'])
df_obj
Out[9]:
No1 No2 No3
0 a b c
1 d e f
为了便于获取每列的数据,我们既可以使用列索引的方式进行获取,也可以通过访问属性的方式来获取列数据,返回的结果是一个Series对象,该对象拥有与原DataFrame对象相同的行索引。例如,获取列索引为“No2”的一列数据,具体代码如下。
In [10]: element = df_obj['No2'] # 通过列索引的方式获取一列数据
element
Out[10]:
0 b
1 e
Name: No2, dtype: object
In [11]: type(element) # 查看返回结果的类型
Out[11]: pandas.core.series.Series
上述示例在输出列数据的同时,又输出了列索引的名称和数据类型,分别为No2和object。下面使用访问属性的方式,获取属性为No2的一列数据,具体代码如下。
In [12]: element = df_obj.No2 # 通过属性获取列数据
element
Out[12]:
0 b
1 e
Name: No2, dtype: object
In [13]: type(element) # 查看返回结果的类型
Out[13]: pandas.core.series.Series
注意:
在获取DataFrame的一列数据时,推荐使用列索引的方式完成,主要是因为在实际使用中,列索引的名称中很有可能带有一些特殊字符(如空格),这时使用“点字符”进行访问就显得不太合适了。
要想为DataFrame增加一列数据,则可以通过给列索引或者列名称赋值的方式实现,类似于给字典增加键值对的操作。不过,新增列的长度必须与其它列的长度保持一致,否则会出现ValueError异常,示例代码如下。
In [14]: df_obj['No4'] = ['g', 'h'] # 增加No4一列数据
df_obj
Out[14]:
No1 No2 No3 No4
0 a b c g
1 d e f h
要想删除某一列数据,则可以使用del语句实现,示例代码如下。
In [15]: del df_obj['No3'] # 删除No3一列数据
df_obj
Out[15]:
No1 No2 No4
0 a b g
1 d e h