You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.0 KiB

3.1.5DataFrame数据选择方法

将DataFrame看作字典

DataFrame可以看作一个由若干Series对象构成的字典,可以通过对列名进行字典形式的取值获取数据。

In: area = pd.Series({'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'Illinois': 149995}) 
In: pop = pd.Series({'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860, 'Illinois': 12882135}) 
In: data = pd.DataFrame({'area':area, 'pop':pop})
In: data["area"]    # data.area 这种属性形式也可以获取到相同的结果
Out: California 423967 
 	Florida 170312 
 	Illinois 149995 
 	New York 141297 
 	Texas 695662 
 	Name: area, dtype: int64

虽然属性形式的数据选择方法很方便,但是它并不是通用的。如果列名不是纯字符串,或者列名与DataFrame的方法同名,那么就不能用属性索引。例如,DataFrame有一个pop()方法,如果用data.pop就不会获取'pop'列,而是显示为方法。

In: data.pop is data['pop']
Out: False

所以,尽量避免用属性形式选择的列直接赋值,即避免data.pop=z这种方式赋值。

Series对象一样,可以用字典形式的语法调整对象,例如增加一列数据。

In: data["density"] = data['pop']/data['area']
In: data
Out:  			area 	pop 	density 
	  California  423967 38332521 90.413926 
 	 Florida 	170312 19552860 114.806121 
 	 Illinois    149995 12882135 85.883763 
 	 New York    141297 19651127 139.076746 
 	 Texas 	  695662 26448193 38.018740

将DataFrame看作二维数组

DataFrame可以看成是一个增强版的二维数组,许多数组操作方式都可以用在DataFrame对象上,例如,用value属性按行查看数组数据,对DataFrame进行转置等等。

In: data.value
Out: 
array(
[[ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01], 
 [ 1.70312000e+05, 1.95528600e+07, 1.14806121e+02], 
 [ 1.49995000e+05, 1.28821350e+07, 8.58837628e+01], 
 [ 1.41297000e+05, 1.96511270e+07, 1.39076746e+02], 
 [ 6.95662000e+05, 2.64481930e+07, 3.80187404e+01]])
In: data.T
Out:


DataFrame看作数组时,我们可以是使用单个行索引获取一行数据。

In: data.values[0]    #取一行数据
Out: array([ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01])

而获取一列数据就需要向DataFrame传递单个列索引,与字典形式的操作相同,都是用data["列名"]获取。


因此,在进行数组形式的取值时,我们就需要用另一种方法——前面介绍过的Pandas索引器loc、ilocix了。通过iloc索引器,我们就可以像对待NumPy数组一样索引Pandas的底层数组(Python的隐式索引),DataFrame的行列标签会自动保留在结果中。

In: data.iloc[1:3, :2]    # 隐式
Out:       area	pop 
 Florida  170312 19552860
 Illinois 149995 12882135
In: data.loc[:'Illinois', :'pop']    #显式
Out: 		area 	pop 
 California 423967 38332521 
 Florida    170312 19552860 
 Illinois   149995 12882135

使用ix索引器可以实现一种混合效果Series中也可以使用这种索引器,但是作用不明显。需要注意的是,ix索引器处理整数索引时和Series对象一样容易让人混淆。

In: data.ix[:3, :"pop"]
Out: 		area	pop 
 California 423967 38332521 
 Florida    170312 19552860 
 Illinois   149995 12882135

任何用于处理NumPy形式数据的方法都可以用于这些索引器,例如在loc索引器中结合使用掩码与花哨索引方法。

In: data.loc[data.density > 100, ['pop', 'density']]
Out:		 pop 	density 
 Florida  19552860 114.806121 
 New York 19651127 139.076746

其他取值方法

还有一些取值方法和前面介绍过的方法不太一样,但是在实际应用中非常实用。

data["列名"]
data["A列":"B列"]
data[0:3]   # 取第一到第四行
data[data.density > 100]  #取density列值大于100的行