DataFrame 是 Pandas 的重要数据结构之一,也是在使用 Pandas 进行数据分析过程中最常用的结构之一,掌握了 DataFrame 的用法,就基本拥有了数据分析的基本能力。DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame也称之为异构数据表,所谓异构指的是不同列的数据类型是可以不同的,可以是字符串、整型或者浮点型等,就好比sql表中每列的数据类型可以不相同一个道理。DataFrame的简单结构如下图所示,其中红色的列表示index,蓝色的行表示columns。

DataFrame创建
Pandas中DataFrame的创建非常简单,语法格式如下:
pd.DataFrame( data, index, columns, dtype, copy)
参数 | 说明 |
---|---|
data | 输入的数据,可以是 ndarray,series,list,dict,标量以及一个 DataFrame。 |
index | 行标签,如果没有传递 index 值,则默认行标签是 np.arange(n),n 代表 data 的元素个数。 |
columns | 列标签,如果没有传递 columns 值,则默认列标签是 np.arange(n)。 |
dtype | dtype表示每一列的数据类型。 |
copy | 默认为 False,表示是否复制数据 data。 |
Pandas提供了多种创建DataFrame的方式,主要包含以下几种最基本的方式:
创建空DataFrame
可以使用下列方式直接创建一个空的DataFrame。
#创建一个空的DataFrame
df = pd.DataFrame()
print(df)
结果如下:
Empty DataFrame
Columns: []
Index: []
使用多维列表DataFrame
使用一维列表创建:
#使用1维度列表
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print(df)
结果如下:
0
0 1
1 2
2 3
3 4
4 5
使用二维列表创建:
#使用2维度列表
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
print(df)
结果如下:
id level rate
0 1 A 3.45
1 2 A 1.68
2 3 E 2.14
3 4 C 3.13
4 5 B 4.33
这里需要注意一点,在使用列表创建时,列表的长度表示行元素的个数,在不指定index和columns的情况下,会默认使用隐式index和columns。
使用Series创建DataFrame
使用Series创建DataFrame时,生成的索引是每个 Series 索引的并集。如果没有指定columns,DataFrame 的columns就是字典键的有序列表。
#使用Series创建DataFrame
data = {'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)
print(df)
结果如下:
one two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0
从Series中指定特定的index
#使用Series创建DataFrame,指定index
data = {'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, index = ['d', 'b', 'c'])
print(df)
结果如下:
one two
d NaN 4.0
b 2.0 2.0
c 3.0 3.0
从Series中指定特定的index和columns
#使用Series创建DataFrame,指定index和columns
data = {'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, index = ['a', 'b', 'c'], columns=['one','two','three'])
print(df)
结果如下:
one two three
a 1.0 1.0 NaN
b 2.0 2.0 NaN
c 3.0 3.0 NaN
这里需要注意的时,在指定index和colunms时,如果在源数据中没有的,会默认使用NaN来填充。
使用字典列表创建DataFrame
一组字典的列表也可以作为输入数据传递给 DataFrame 构造函数。默认情况下,字典的key会被用作columns。
#使用字典列表创建DataFrame
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print(df)
结果如下:
a b c
0 1 2 NaN
1 5 10 20.0
如果在没有指定index的情况下, DataFrame会默认使用隐式索引,因此也可以手动去指定index:
#使用字典列表创建DataFrame,指定index
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print(df)
结果如下:
a b c
first 1 2 NaN
second 5 10 20.0
使用字典列表创建DataFrame时,还可以通过指定columns来从字典中挑选出指定的key并按找columns中的顺序来创建DataFrame,如果指定的column在key中不存在,则用NaN来补充数据
#使用字典列表创建DataFrame,指定index和columns
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'], columns=['b','a','d'])
print(df)
结果如下:
b a d
first 2 1 NaN
second 10 5 NaN
DataFrame基本属性
名称 | 基本属性 |
---|---|
T | 行和列转置 |
axes | 返回一个仅以行索引和列索引的列表。 |
dtypes | 返回每列数据的数据类型 |
empty | DataFrame中没有数据或者任意坐标轴的长度为0,则返回True |
ndim | 轴的数量,也指numpy 数组的维数 |
shape | 返回一个元组,表示了 DataFrame 维度 |
size | DataFrame中的元素数量 |
values | 使用 numpy 数组表示 DataFrame 中的元素值 |
为了对上述基本属性进行演示,这里我们先创建一个DataFrame:
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
print(df)
结果如下:
id level rate
0 1 A 3.45
1 2 A 1.68
2 3 E 2.14
3 4 C 3.13
4 5 B 4.33
T
print(df.T)
结果如下:
0 1 2 3 4
id 1 2 3 4 5
level A A E C B
rate 3.45 1.68 2.14 3.13 4.33
axes
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
df.axes
结果如下:
[RangeIndex(start=0, stop=5, step=1),
Index(['id', 'level', 'rate'], dtype='object')]
dtypes
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
df.dtypes
结果如下:
id int64
level object
rate float64
dtype: object
empty
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
df.empty
结果如下:
False
如果此时我们重新创建一个空的DataFrame
df = pd.DataFrame()
df.empty
结果如下:
True
ndim
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
df.ndim
结果如下:
2
shape
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
df.shape
结果如下:
(5, 3)
size
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
df.size
结果如下:
15
values
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
df.values
结果如下:
array([[1, 'A', 3.45],
[2, 'A', 1.68],
[3, 'E', 2.14],
[4, 'C', 3.13],
[5, 'B', 4.33]], dtype=object)
DataFrame操作
DataFrame 可以分别使用列索引(columns)和行索引(index)来完成数据的选取、添加和删除操作。下面依次对这两种类型的操作进行简单介绍。
列索引操作DataFrame
DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作。
1.列索引选取列数据
data = [[1,'A',3.45],[2,'A',1.68],[3,'E',2.14],[4,'C',3.13],[5,'B',4.33]]
df = pd.DataFrame(data, columns = ['id','level','rate'])
print(df['rate'])
结果如下:
0 3.45
1 1.68
2 2.14
3 3.13
4 4.33
Name: rate, dtype: float64
2.列索引添加列数据
可以利用其他列的数据来生成新的列数据据
df['flag'] = df['rate'] > 2
print(df)
结果如下:
id level rate flag
0 1 A 3.45 True
1 2 A 1.68 False
2 3 E 2.14 True
3 4 C 3.13 True
4 5 B 4.33 True
也可以直接添加新数据列
df['del'] = [1,1,2,2,3]
print(df)
结果如下:
id level rate flag del
0 1 A 3.45 True 1
1 2 A 1.68 False 1
2 3 E 2.14 True 2
3 4 C 3.13 True 2
4 5 B 4.33 True 3
3.列索引删除列数据
删除列数据的方式有多种,首先可以使用del
进行删除:
del df['del']
print(df)
结果如下:
id level rate flag
0 1 A 3.45 True
1 2 A 1.68 False
2 3 E 2.14 True
3 4 C 3.13 True
4 5 B 4.33 True
另外还可以通过pop
进行列数据的删除:
df.pop('flag')
结果如下:
0 True
1 False
2 True
3 True
4 True
Name: flag, dtype: bool
这个时候原DataFrame变成了
id level rate
0 1 A 3.45
1 2 A 1.68
2 3 E 2.14
3 4 C 3.13
4 5 B 4.33
行索引操作DataFrame
行索引操作和列索引操作类似,也分别包括行索引取数,添加行,删除行等
1.index索引取数
index索引取数时通过将行索引传递给函数loc来实现的
#使用字典列表创建DataFrame,指定index
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
df.loc['first']
结果如下:
a 1.0
b 2.0
c NaN
Name: first, dtype: float64
2.隐式索引取数
隐式索引为0~range(n)的整数,可以通过方法iloc来对指定行进行取数
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
df.iloc[0]
结果如下:
a 1.0
b 2.0
c NaN
Name: first, dtype: float64
3.多行索引取数
DataFrame还支持以切片的方式进行多行取数,需要注意的是,中括号内如果不是切片,那么则是按列索引进行取数,这是需要注意的一点
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print(df[0:2])
结果如下:
a b c
first 1 2 NaN
second 5 10 20.0
另外还可以使用head()
方法进行头部n行取数,如果不指定参数,默认取5行。
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print(df.head(1))
结果如下:
a b c
first 1 2 NaN
另外还可以使用tail()
方法进行尾部n行取数,如果不指定参数,默认取5行。
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print(df.tail(1))
结果如下:
a b c
second 5 10 20.0
4.多行索引取数
DataFrame还支持以切片的方式进行多行取数,需要注意的是,中括号内如果不是切片,那么则是按列索引进行取数,这是需要注意的一点
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print(df[0:2])
结果如下:
a b c
first 1 2 NaN
second 5 10 20.0
5.添加数据行
与添加列数据不同的是,添加行需要使用cancat()
方法进行追加,也可以使用append()
方法,但是append已被弃用。
data1 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df1 = pd.DataFrame(data, index=['first', 'second'])
data2 = [{'a': 7, 'b': 3,'c':6}, {'a': 5, 'c': 9}]
df2 = pd.DataFrame(data, index=['third', 'fourth'])
df = pd.concat([df1, df2])
print(df)
结果如下:
a b c
first 1 2 NaN
second 5 10 20.0
third 1 2 NaN
fourth 5 10 20.0
6.行索引删除数据
行索引删除数据使用drop()
方法,由于Pandas的行索引是可以允许重复的,因此当有多个index重复时,删除某个index中的行数据会将所有index为改值的行全部删除。
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20},{'a': 7, 'b': 3,'c':6}, {'a': 5, 'c': 9}]
df = pd.DataFrame(data, index=['first', 'second','third', 'fourth'])
print(df.drop('first'))
结果如下:
a b c
second 5 10.0 20.0
third 7 3.0 6.0
fourth 5 NaN 9.0
关于DataFrame就简单的介绍到这里,由于Pandas是个面向数据分析的工具,因此内部集成了很多数据分析使用到的方法,这些方法作用在Series和DataFrame上来实现特定的数据分析需求,后面如果有时间,会简单介绍几个在数据分析中常用的一些方法。
网友评论