Python 3.x 基于用户输入动态筛选数据帧

Python 3.x 基于用户输入动态筛选数据帧,python-3.x,pandas,dataframe,optimization,plotly-dash,Python 3.x,Pandas,Dataframe,Optimization,Plotly Dash,如果能提供一种计算效率更高的方法来动态过滤数据帧,我将不胜感激 数据帧lendf.index的大小约为680000 当选择散点图上的点时,将触发Plotly Dash仪表板回调函数中的此代码。这些点作为包含键为“a”到“C”的各种属性的字典列表传递给点。这允许用户选择pandas.DataFrame实例df中的数据子集进行交叉过滤分析 rows_boolean = pandas.Series([False] * len(df.index)) for point in points:

如果能提供一种计算效率更高的方法来动态过滤数据帧,我将不胜感激

数据帧lendf.index的大小约为680000

当选择散点图上的点时,将触发Plotly Dash仪表板回调函数中的此代码。这些点作为包含键为“a”到“C”的各种属性的字典列表传递给点。这允许用户选择pandas.DataFrame实例df中的数据子集进行交叉过滤分析

rows_boolean = pandas.Series([False] * len(df.index))

for point in points:    
    current_condition = ((df['A'] == point['a']) & (df['B'] == point['b']) 
        & (df['C'] >= point['c']) & (df['C'] < point['d']))
    rows_boolean = rows_boolean | current_condition                      

filtered = df.loc[rows_boolean, list_of_column_names]
我主要关心的是,当通过的查询有几十个甚至几百个条件串在一起时,我不知道查询方法的效率有多高。此解决方案目前也不允许使用列名称列表选择列

另一个可能的解决方案可能来自于实现类似的功能。 重申一下,速度在这里是关键,所以我不只是想要一些有效的东西,而是比我上面的布尔实现更快的东西:

应该有一种——最好只有一种——显而易见的方法来做到这一点。政治公众人物20


听起来瓶颈是for循环,而不是访问行。您做过任何评测吗?@JTanner在编辑中善意地澄清了这一点,这里的速度问题是for循环中的代码。不,我没有做过任何评测-我是一个代码优化新手!您能否发布一个运行并产生与实际情况类似的性能特征的代码示例?听起来瓶颈是for循环,而不是访问行。您做过任何评测吗?@JTanner在编辑中善意地澄清了这一点,这里的速度问题是for循环中的代码。不,我没有做过任何评测-我是一个代码优化新手!您是否可以发布一个运行并产生与您的实际案例类似的性能特征的代码示例?
query = ' | '.join([f'((A == {point["a"]}) & (B == {point["b"]}) 
    & (C >= {point["c"]}) & (C < {point["d"]}))' for point in points])                

filtered = df.query(query)