Python Pandas-是否可以将dataframe.query方法与计数器结合运行

Python Pandas-是否可以将dataframe.query方法与计数器结合运行,python,pandas,Python,Pandas,我在pandas中的数据帧上运行一个相当复杂的过滤器(我通过字典过滤通过67个不同阈值的测试结果)。为此,我有以下几点: query_string = ' | '.join([f'{k} > {v}' for k , v in dictionary.items()]) test_passes = df.query(query_string, engine='python') new_df = df.apply(pd.Series.value_counts, axis = 1) #wher

我在pandas中的数据帧上运行一个相当复杂的过滤器(我通过字典过滤通过67个不同阈值的测试结果)。为此,我有以下几点:

query_string = ' | '.join([f'{k} > {v}' for k , v in dictionary.items()])
test_passes = df.query(query_string, engine='python')
new_df = df.apply(pd.Series.value_counts, axis = 1) #where df is your current dataframe holding the pass/fails

df[new_df.columns] = new_df
其中k是测试名称,v是阈值

这是很好的工作,我能够将测试通过的行导出到csv


我想知道是否有一种方法可以附加一个列来计算测试通过的次数。例如,如果特定行记录了1-67次测试通过。

这里回答了这个问题:

但举个例子,你可以做以下几点:

query_string = ' | '.join([f'{k} > {v}' for k , v in dictionary.items()])
test_passes = df.query(query_string, engine='python')
new_df = df.apply(pd.Series.value_counts, axis = 1) #where df is your current dataframe holding the pass/fails

df[new_df.columns] = new_df

您可以使用以下方法:

dictionary = {'a':'b', 'b': 'c'}
data = pd.DataFrame({'a': [1,2,3], 'b': [ 2,1,2], 'c': [2,1,1] })
test_components = pd.DataFrame([df.loc[:, k] > df.loc[:, v] for k , v in dictionary.items()]).T
# now can inspect what conditions were met in `test_components` variable
condition = test_components.any(axis=1)
data_filtered = data.loc[common_condition, :] 

因此,我最终通过以下内容“解决”了问题,从最初发布的熊猫查询开始。最初的问题是关于我的用例的测试通过,如果实际上是关于测试失败,那么

test_failures = data.query(query_string, engine='python').copy()
复制是为了防止无意的数据操纵和链接错误消息

for k, row in test_failures.iterrows():
    failure_count=0
    test_count=0
    for key, val in threshold_dict.items():
        test_count +=1
        if row[key] > val:
            failure_count +=1
    test_failures.at[k, 'Test Count'] = test_count
    test_failures.at[k, 'Failure Count'] = failure_count
据我所知,iterrows()不是最快的迭代方法,但它确实分别提供了索引(k)和数据字典(row),我发现这比itertuples()中返回的元组更有用

完成一点排序和保存


我已经在一个(8000 x 66)的虚拟数据集上进行了测试-它没有提供突破性的速度,但它确实做到了这一点。任何改进都将是伟大的

困难的是,在我当前的数据帧中,我没有布尔值“通过/失败”,而是值0.006。正是这些值,我正在使用外部字典测试通过/失败。因此,要明确的是,您的字典中包含了确定您的数据帧行值是否通过的关键值?您可以从您的数据帧上载一个示例行吗?如果行很长,只需将其缩减为5列,最终分辨率应该能够根据您的需要放大。您完全正确-我的字典确定数据帧中的行值是“通过”还是“失败”。我实际上找到了一个解决方案,我将在下面发布……也许你可以让我知道你的想法?我的字典更像{'a':0.005,'b':0.26},有65个这样的条目。我的数据框是数千行,其中包含从csv读取的值。好的,我想问一下,您的字典是否包含解决方案(又名“传递值”必须是一个字典?因为我认为如果它也是熊猫数据框,事情会变得更容易。它是字典的唯一原因是我喜欢键值对的功能。我没有考虑使用另一个熊猫数据框作为分析工具。我会研究一下,看看它是否能提高p性能和分析。感谢@RockAndroeCoder