《Python数据科学手册》读书笔记
3.2.2 Pandas的DataFrame对象
Pandas的另一个基础数据结构是DataFrame。和之前介绍的Series一样,DataFrame既可以作为一个通用型Numpy数组,也可以看做特殊的Python字典。
1.DataFrame是通用的Numpy数组
如果将Series 类比为带灵活索引的一维数组,那么DataFrame 就可以看作是一种既有灵活的行索引,又有灵活列索引的二维数组。就像你可以把二维数组看成是有序排列的一维数组一样,你也可以把DataFrame 看成是有序排列的若干Series 对象。这里的“排列”指的是它们拥有共同的索引。
In [1] : improt numpy as np
import pandas as pd
In [2] : population_dict = {'California': 38332521,
'Texas': 26448193,
'New York': 19651127,
'Florida': 19552860,
'Illinois': 12882135}
population = pd.Series(population_dict)
area_dict = {'California': 423967,
'Texas': 695662,
'New York': 141297,
'Florida': 170312,
'Illinois': 149995}
area = pd.Series(area_dict)
In [3] : area
Out[3] :California 423967
Texas 695662
New York 141297
Florida 170312
Illinois 149995
dtype: int64
In [4] : polulation
Out[4] :California 38332521
Texas 26448193
New York 19651127
Florida 19552860
Illinois 12882135
dtype: int64
# 用一个字典创建一个包含以上信息的二维对象
In [5] :states = pd.DataFrame({'population':polulation,'area':area})
In [6] :states
Out[6] :
population area
California 38332521 423967
Texas 26448193 695662
New York 19651127 141297
Florida 19552860 170312
Illinois 12882135 149995
In [7] :states.index # index属性 获取行索引标签
Out[7] :Index(['California', 'Texas', 'New York', 'Florida', 'Illinois'], dtype='object')
In [8] :states.columns # columns属性 获取列索引标签
Out[8] :Index(['population', 'area'], dtype='object')
因此,DataFrame 可以看作一种通用的NumPy 二维数组,它的行与列都可以通过索引获取。
2. DataFrame是特殊的字典
与Series 类似,我们也可以把DataFrame 看成一种特殊的字典。字典是一个键映射一个值,而DataFrame 是一列映射一个Series 的数据。例如,通过’area’ 的列属性可以返回
包含面积数据的Series 对象:
In [9] :states['area'] # 面积数据
Out[9] :California 423967
Florida 170312
Illinois 149995
New York 141297
Texas 695662
Name: area, dtype: int64
3.创建DataFrame对象
①.通过单个Series对象创建
给一个Series对象作为data,给定列名columns
In [10] :pd.DataFrame(population, columns=['population'])
Out[10] :
population
California 38332521
Texas 26448193
New York 19651127
Florida 19552860
Illinois 12882135
②.通过字典列表创建。
任何元素是字典的列表都可以变成DataFrame。(本质是列表)用一个简单的列表综合来创建一些数据:
In [11] :data = [{'a': i, 'b': 2 * i} for i in range(2,5)]
In [12] :data
Out[12] :[{'a': 2, 'b': 4}, {'a': 3, 'b': 6}, {'a': 4, 'b': 8}]
In [13] :pd.DataFrame(data)
Out[13] :
a b
0 2 4
1 3 6
2 4 8
即使字典中有些键不存在,Pandas 也会用缺失值NaN(不是数字,not a number)来表示:
In [14] :pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])
Out[14] :
a b c
0 1.0 2 NaN
1 NaN 3 4.0
③.通过Series 对象字典创建
用一个字典创建,字典的value值为Series对象。(本质是字典)
In [15] :pd.DataFrame({'population':polulation,'area':area})
Out[15] :
population area
California 38332521 423967
Texas 26448193 695662
New York 19651127 141297
Florida 19552860 170312
Illinois 12882135 149995
④.通过NumPy 二维数组创建
假如有一个二维数组,就可以创建一个可以指定行列索引值的DataFrame。如果不指定行列索引值,那么行列默认都是整数索引值:(,本质是给一个多维Series对象,给定行索引index,给定列索引columus,默认为None)
In [16] :pd.DataFrame(np.random.rand(3, 2),columns=['foo', 'bar'],index=['a', 'b', 'c'])
Out[16] :
foo bar
a 0.754991 0.898389
b 0.324190 0.100392
c 0.611049 0.332776