第五章
5.2.3 索引选择与过滤
Series的索引与NumPy数组的索引功能类似,不过Series的索引值可以不仅仅是整数。
>>>obj = pd.Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
>>>obj
a 0.0
b 1.0
c 2.0
d 3.0
dtype: float64
>>>obj['a']
0.0
>>>obj[0]
0.0
#索引多个值
>>>obj[['a', 'c']]
a 0.0
c 2.0
dtype: float64
#布尔值索引(按条件过滤)
>>>obj[obj > 2]
d 3.0
dtype: float64
与普通的python切片不包含尾部不同的是,Series的切片是包含尾部值的:
obj['a':'c']
a 0.0
b 1.0
c 2.0
dtype: float64
obj[0:2]
a 0.0
b 1.0
Series的索引和切片也是视图,所以通过索引设值,会改变原Series相应的部分:
>>>obj[['a', 'c']] = 5
>>>obj
a 5.0
b 1.0
c 5.0
d 3.0
dtype: float64
使用单个值或者序列,可以从DataFrame中选择一个或者多个列:
>>>data = pd.DataFrame(np.arange(16).reshape((4, 4)), index=['dog', 'cat', 'lion', 'panda'], columns=['one','two', 'three', 'four'])
>>>data
one two three four
dog 0 1 2 3
cat 4 5 6 7
lion 8 9 10 11
panda 12 13 14 15
>>>data['two']
dog 1
cat 5
lion 9
panda 13
Name: two, dtype: int32
>>>data[['one', 'four']]
one four
dog 0 3
cat 4 7
lion 8 11
panda 12 15
上面传递单个元素或者一个列表到DataFrame中可以选择列;选择行的话,需要使用整数标签:
>>>data[:2]
one two three four
dog 0 1 2 3
cat 4 5 6 7
DataFrame配合布尔值数组进行切片可以让我们更加方便的选取自己需要的数据部分:
#选取‘three’列中值大于5的部分的前两行
>>>data[data['three'] > 5][:2]
one two three four
cat 4 5 6 7
lion 8 9 10 11
对DataFrame索引的设置同样会映射到原DataFrame:
>>>data[data > 10] = 999
>>>data
one two three four
dog 0 1 2 3
cat 4 5 6 7
lion 8 9 10 999
panda 999 999 999 999
5.2.3.1 使用loc和iloc选择数据
在DataFrame中,虽然向上面那样的数据选择方式已经挺方便了,但是也具有明显的缺陷:选择行的时候对标签利用的不充分,这会更容易出错。所以pandas设置了特殊的索引符号:loc
和iloc
。我们可以选择使用轴标签(loc)和整数标签(iloc)来选出数组的行和列的子集。
>>>data
one two three four
dog 0 1 2 3
cat 4 5 6 7
lion 8 9 10 11
panda 12 13 14 15
#选取行
data.loc['cat']
one 4
two 5
three 6
four 7
Name: cat, dtype: int32
>>>data.iloc[1]
one 4
two 5
three 6
four 7
Name: cat, dtype: int32
#选取列
>>>data.loc[:,'one']
dog 0
cat 4
lion 8
panda 12
Name: one, dtype: int32
>>>data.iloc[:,0]
dog 0
cat 4
lion 8
panda 12
Name: one, dtype: int32
>>>data.loc['lion', ['two', 'four']]
two 9
four 11
Name: lion, dtype: int32
#等同于
>>>data.iloc[2, [1, 3]]
two 9
four 11
Name: lion, dtype: int32
除了用于单个标签或者标签列表外,索引功能还可以用于切片:
>>>data.loc[:'lion', 'two':'four']
two three four
dog 1 2 3
cat 5 6 7
lion 9 10 11
还可以进一步进行过滤:
>>>data.loc[:'lion', 'two':'four'][data.four > 4]
two three four
cat 5 6 7
lion 9 10 11
DataFrame的索引选项:
类型 | 描述 |
---|---|
df[val] | 从DataFrame中选择单列或者列序列;特殊情况的便利:布尔数组(过滤行),切片(切片行)或布尔值DataFrame(根据某些标准设置的值 |
df.loc[val] | 根据标签选择DataFrame的单行或多行 |
df.loc[:, val] | 根据标签选择单列或多列 |
df.lco[val1, val2 | 同时选择行和列的一部分 |
df.iloc[where] | 根据整数位置选择单行或多行 |
df.iloc[:, where] | 根据整数位置选择单列或多列 |
df.iloc[where_i, where-j | 根据整数位置选择行和列 |
df.at[label_i, label_j] | 根据行、列标签选择单个标量值 |
df.iat[i, j] | 根据行、列整数位置选择单个标量值 |
reindex方法 | 通过标签选择行或列 |
get_values, set_values | 根据行和列的标签设置单个值 |