在使用list或者numpy array时,经常需要对里面的每一个元素进行操作。当然使用for循环是最简单的,但for循环速度非常慢。在网上找了很久没有合适的,后来想到pandas包中的apply()函数,pandas包内置numpy array科学计算模块,速度大大高于for循环。
如我有个list 需要对里面的元素去除文件夹名字“chrom_kmer/”
>>> import numpy as np
>>> import pandas as pd
>>> idname
['chrom_kmer/1765.179.con.10_1mer', 'chrom_kmer/1765.179.con.10_12001mer', 'chrom_kmer/1765.179.con.10_18001mer', 'chrom_kmer/1765.179.con.10_24001mer', 'chrom_kmer/1765.179.con.10_30001mer', 'chrom_kmer/1765.179.con.10_36001mer', 'chrom_kmer/1765.179.con.10_42001mer', 'chrom_kmer/1765.179.con.10_48001mer', 'chrom_kmer/1765.179.con.105_1mer', 'chrom_kmer/1765.179.con.105_102001mer']
1. 最简单的方法是列表表达式,同for循环类似
最简单的是字符串切片,从第12个位置取:
>>> id_clear=[i[12:] for i in idname]
>>> id_clear
['765.179.con.10_1mer', '765.179.con.10_12001mer', '765.179.con.10_18001mer', '765.179.con.10_24001mer', '765.179.con.10_30001mer', '765.179.con.10_36001mer', '765.179.con.10_42001mer', '765.179.con.10_48001mer', '765.179.con.105_1mer', '765.179.con.105_102001mer']
这种类似for循环的方法太慢,可以使用numpy加pandas的apply函数,对里面元素进行操作,速度更快
2. 使用pd.apply()函数
>>> id_series=pd.Series(idname) # 将list或者numpy array转化为pandas的Series,如果是多维数组,改用pd.DataFrame()
>>> id_clear2=id_series.apply(lambda x:x[12:]) # 使用pandas.appy()函数
>>>id_clear2 # 得到的是numpy array
0 765.179.con.10_1mer
1 765.179.con.10_12001mer
2 765.179.con.10_18001mer
3 765.179.con.10_24001mer
4 765.179.con.10_30001mer
5 765.179.con.10_36001mer
6 765.179.con.10_42001mer
7 765.179.con.10_48001mer
8 765.179.con.105_1mer
9 765.179.con.105_102001mer
dtype: object
# 如果想转化为list,直接用numpy.tolist()函数
>>> id_clear2 = id_clear2.tolist()
>>> id_clear2
['765.179.con.10_1mer', '765.179.con.10_12001mer', '765.179.con.10_18001mer', '765.179.con.10_24001mer', '765.179.con.10_30001mer', '765.179.con.10_36001mer', '765.179.con.10_42001mer', '765.179.con.10_48001mer', '765.179.con.105_1mer', '765.179.con.105_102001mer']
大功告成,如果是多维array,可用pd.DataFrame()转化成pandas格式,采用apply()或者applymap()函数来操作。