我有一个pandas数据框,在循环的每次迭代中,我都需要根据每次迭代唯一的条件在其中找到特定的行。我这样做是:
condition = ((all_together["Chr"] == chrom) &
(all_together["Start"] <= true_center) &
(all_together["End"] >= true_center))
this_bin = all_together[condition]
all_together
是我的数据帧的名称,而chrom和true_center是每个循环迭代唯一的参数。
基于%prun
和%lprun
分析,花费的大部分时间都在条件的“开始”和“结束”部分中。我通过转换为分类数据类型优化了“ Chr”查找,但是对于“ Start”和“ End”列,数据框中的值是一个需要与True_center(另一个数字)进行比较的数字。
有人对提高速度有任何想法吗?数据是按数字有效地“排序”的,但是在这里我找不到一种很好的方法来利用它。也欢迎任何其他方法,谢谢您的帮助!
答案 0 :(得分:0)
在某些情况下,您可能会发现np.logical_and
的效率更高:
import pandas as pd, numpy as np
np.random.seed(0)
df = pd.DataFrame({'val': np.random.randint(0, 100, 10000000)})
x = np.logical_and(df['val'] >= 20, df['val'] <= 60)
y = df['val'].between(20, 60)
z = (df['val'] >= 20) & (df['val'] <= 60)
assert (x==y).all() and (y==z).all()
%timeit np.logical_and(df['val'] >= 20, df['val'] <= 60) # 36.8 ms
%timeit df['val'].between(20, 60) # 59.7 ms
%timeit (df['val'] >= 20) & (df['val'] <= 60) # 60.4 ms