优化Pandas DataFrame过滤

时间:2018-07-30 21:00:00

标签: python pandas numpy dataframe indexing

我有一个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(另一个数字)进行比较的数字。

有人对提高速度有任何想法吗?数据是按数字有效地“排序”的,但是在这里我找不到一种很好的方法来利用它。也欢迎任何其他方法,谢谢您的帮助!

1 个答案:

答案 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