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
4.0 KiB
3.1.5:DataFrame数据选择方法
将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、iloc
和ix
了。通过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的行