第五章
5.1.3索引对象
pandas中的索引对象是用于存储轴标签和其它元数据的(例如轴名称和标签)。在构造Series或FataFrame时,使用的任意数组或标签序列,都可以在内部转换为索引对象。
>>>obj = pd.Series(range(3), index=['a', 'b', 'c'])
>>>index = obj.index
>>>index
Index(['a', 'b', 'c'], dtype='object')
>>>index[1:]
Index(['b', 'c'], dtype='object')
索引对象是不可变的,因此我们是无法修改索引对象的。这种不变性使得在多种数据结构中分享索引对象更为安全。
除了类似数组,索引对象也像一个固定大小的集合,但与python集合不同的是,pandas索引对象可以包含重复标签
。如果根据重复标签进行筛选,会选出所有重复标签对应的数据。
每个索引对象都有一些集合逻辑的方法和属性,常用的如下:
方法 | 描述 |
---|---|
append | 将额外的索引对象黏贴到原索引后,产生一个新的索引 |
difference | 计算两个索引的差集 |
intersection | 计算两个索引的交集 |
union | 计算两个索引的并集 |
delete | 将位置i的元素删除,并产生新的索引 |
insert | 在位置i处插入元素,并产生新的索引 |
is_monotonic | 如果索引序列递增则返回True |
is_unique | 如果索引序列唯一则返回True |
unique | 计算索引的唯一值序列 |
5.2 基本功能
5.2.1 重建索引
reindex
用于创建一个符合新索引的新对象,当Series调用reindex
方法时,会将数据按照新的索引进行排列,如果某个索引之前不存在,则会引入缺失值。
>>>obj = pd.Series([3.6, 8.7, -1.2, 9.9], index=['d', 'a', 'c','b' ])
>>>obj
d 3.6
a 8.7
c -1.2
b 9.9
dtype: float64
>>>obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])
>>>obj2
a 8.7
b 9.9
c -1.2
d 3.6
e NaN
dtype: float64
对于像时间序列一样的顺序数据,在重建索引时可能会需要进行插值或者填值,method可选参数允许我们使用诸如ffill
(将值向前填充)或者bfill
(向后填充)等方法在重建索引值时插值:
>>>obj3 = pd.Series(['dog', 'cat', 'panda'], index=[0, 2, 4])
>>>obj3
0 dog
2 cat
4 panda
dtype: object
>>>obj3.reindex(range(6), method='ffill')
0 dog
1 dog
2 cat
3 cat
4 panda
5 panda
dtype: object
#重建索引并不会改变原Series
>>>obj3
0 dog
2 cat
4 panda
dtype: object
在DataFrame中,reindex
既可以改变行索引,又可以改变列索引,当然也可以同时改变两者,当仅传入一个序列时,结果中的行会重建索引;如果要改变列的索引,需要设置columns
关键字。
>>>frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['dog', 'cat', 'panda'])
>>>frame
dog cat panda
a 0 1 2
c 3 4 5
d 6 7 8
>>>frame2 = frame.reindex(['a', 'b', 'c', 'd'])
>>>frame2
dog cat panda
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
>>>pets = ['dog', 'panda', 'lion']
>>>frame3 = frame.reindex(columns=pets,fill_value=3)
dog panda lion
a 0 2 3
c 3 5 3
d 6 8 3
reindex方法的参数
参数 | 描述 |
---|---|
index | 新建作为索引的序列,可以是索引实例或任意其他序列类型的python数据结构,索引使用时无需复制 |
method | 插值方式:ffill为向前填充,bfill为向后填充 |
fill_value | 通过重新索引引入缺失数据时使用的替代值 |
limit | 向前或向后填充时,所需填充的最大尺寸间隙(以元素数量) |
copy | 如果为True,即使新索引等于旧索引,也总会复制底层数据;若为False,则索引相同时不要复制数据 |
5.2.2 轴向上删除数据
使用drop
方法可以删除Series和DataFrame中的条目,它返回一个删除选定条目后的对象,并不是直接改变原数据
。在DataFrame中,索引值可以从轴向上删除,在使用drop时,使用标签序列会根据行标签删除值(0轴),但可以通过传递axis=1
或者axis='columns'
来根据标签删除列。
>>>frame
dog cat panda
a 0 1 2
c 3 4 5
d 6 7 8
>>>frame.drop('c')
dog cat panda
a 0 1 2
d 6 7 8
#原数据没有删除"c'
>>>frame
dog cat panda
a 0 1 2
c 3 4 5
d 6 7 8
#删除列
>>>frame.drop('panda', axis=1)
dog cat
a 0 1
c 3 4
d 6 7
>>>frame
dog cat panda
a 0 1 2
c 3 4 5
d 6 7 8
但是我们可以通过设置inplace=True
来直接对原数据进行更改:
>>>frame.drop('panda', axis=1, inplace=True)#不再返回新对象,直接更改原数据
>>>frame
dog cat
a 0 1
c 3 4
d 6 7
微生物基因组—关于基因组时代的细菌多样性
1,大多数细菌种群间发生基因片段重组的概率与突变发生的概率相当或者高一些。
2,由于基因重组比单核苷酸突变所涉及的核苷酸要多的多,所以对一段特定的核苷酸序列,重组的影响比突变高80倍。
3,虽然细菌中的重组并不稀少,但是依赖稀有重组的细菌进化模式是不合理的。
4,细菌可以与DNA序列相差25%以上的菌发生同源重组,分析表明,细菌基因组的一部分(5%~10%)可能来自不同种的细菌。
5,假定种群间和种群内的重组率相同,那么重组就能很快的使种群间差异消失。但相对而言,细菌间的重组率非常低,所以种间重组的发生并不影响种间差异。
6,虽然高频重组毫无疑问会产生细菌的遗传多样性,周期性选择导致多样性丧失是对重组最大的挑战,细菌需要重组的高频率才能保持生物多样性。但现实的情况是,即使细菌的重组频率达到很高的水平,但对遗传多样性的贡献也非常有限。