Pandas中Axis的标签(比如列标签,行标签)在数据分析,可视化等中非常的重要,数据对齐的功能也是基于标签实现的,正是这些标签可以让我们很便利的操作数据,比如选取数据或者构造数据的子集.这一章,我们将聚焦Pandas中的数据选取和索引.
一.列(columns)数据访问的方式和区别
首先,举个例子来介绍一下基本概念.
df = pd.DataFrame(np.random.randint(1,10, 8).reshape(4,2), index=list('abcd'), columns=['First', 'Secend'])
df
Out[19]:
First Secend
a 7 7
b 6 9
c 2 9
d 2 7
访问df中列(columns)的数据有两种不同的方式,为每种方式规定了不同的名称.
操作符号[ ]的方式,被称为标准访问(standard)
操作符号 . 的方式,被称为属性访问(attribute)
这两种方式都可以访问到df的列数据,比如:
df.First
Out[24]:
a 7
b 6
c 2
d 2
Name: First, dtype: int32
df['First']
Out[25]:
a 7
b 6
c 2
d 2
Name: First, dtype: int32
这两种方式虽然都可以访问数据,但还是存在一些区别的.
1.属性访问的方式是不能增加或者创建新的列的数据的,而标准访问的方式是可以的
df.Three = list(range(len(df.index)))
__main__:1: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access
df['Three'] = list(range(len(df.index)))
df
Out[30]:
First Secend Three
a 7 7 0
b 6 9 1
c 2 9 2
d 2 7 3
2.属性访问的方式中,属性的命名(既列的名称)是有限制的,是不能和一些已经存在的函数名或者说关键字冲突的,即使真的存在这样的列名.而标准访问是不受此限制的.
#为df新增一列min数据作为演示
df['min']=0
df
Out[34]:
First Secend Three min
a 7 7 0 0
b 6 9 1 0
c 2 9 2 0
d 2 7 3 0
df.min
Out[35]:
<bound method DataFrame.min of First Secend Three min
a 7 7 0 0
b 6 9 1 0
c 2 9 2 0
d 2 7 3 0>
df['min']
Out[36]:
a 0
b 0
c 0
d 0
Name: min, dtype: int64
二.行(rows)数据访问的方式和区别
行数据的有三种方式或者说方法:
loc 基于行标签(label)的访问
iloc 基于行位置的访问(position)
[ ] 标准方式中使用用range范围
除了标准方式只能接受range范围外,loc和iloc方法接受的可以是单一的label或position,也可以是多个label或position组成的列表,或者切片方式的range,还可以是boolean array ,甚至可以是callable函数.
需要注意的是,loc的切片方式是闭区间,比如a:c是包含c的,而iloc的切片是开区间,比如1:3是不包含3的.
df.loc['a':'c']
Out[45]:
First Secend Three min
a 7 7 0 0
b 6 9 1 0
c 2 9 2 0
df.iloc[0:2]
Out[46]:
First Secend Three min
a 7 7 0 0
b 6 9 1 0
df[:2]
Out[47]:
First Secend Three min
a 7 7 0 0
b 6 9 1 0
首先来看看loc方法的一些特性.
loc进行boolean选择
df
Out[51]:
First Secend Three min
a 0 7 0 7
b 0 9 1 6
c 0 9 2 2
d 0 7 3 2
df.loc[:,df.loc['a']>0]
Out[52]:
Secend min
a 7 7
b 9 6
c 9 2
d 7 2
仅对于loc的label索引,如果索引是由多个label组成的列表,而且列表中包含不存在的label, 那么目前0.23的版本虽然会返回结果,但将会提示错误.这时可以使用reindex方法代替.
df
Out[82]:
First Secend Three min
a 0 7 0 7
b 0 9 1 6
c 0 9 2 2
d 0 7 3 2
df.loc[['a','f']]
__main__:1: FutureWarning:
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.
See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
Out[83]:
First Secend Three min
a 0.0 7.0 0.0 7.0
f NaN NaN NaN NaN
df.reindex(['a','f&