利用python进行数据分析(十七)

第五章

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设置了特殊的索引符号:lociloc。我们可以选择使用轴标签(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根据行和列的标签设置单个值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值