【问题标题】:Python Pandas - Is it possible to run a dataframe.query method in combination with a counterPython Pandas - 是否可以结合计数器运行 dataframe.query 方法
【发布时间】:2019-03-22 03:16:43
【问题描述】:

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

query_string = ' | '.join([f'{k} > {v}' for k , v in dictionary.items()])
test_passes = df.query(query_string, engine='python')

其中 k 是测试名称,v 是阈值。

这很好用,我可以将测试通过的行导出到 csv。

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    所以我终于“解决”了以下问题,从最初发布的 pandas 查询开始。最初的问题是我的用例的测试通过,如果实际上是测试失败......

    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) 和数据字典 (行),我发现它们比 itertuples() 中返回的元组更有用.

    sorted_test_failures = test_failures.sort_values('Failure Count', ascending=False)  
    
    sorted_test_failures.to_csv('failures.csv', encoding='utf8')
    

    稍微整理和保存以完成。

    我已经在 (8000 x 66) 的虚拟数据集上进行了测试 - 它没有提供突破性的速度,但可以完成工作。任何改进都会很棒!

    【讨论】:

    • 好的,我想我想问一下您的字典是否包含解决方案(又名“传递值”,必须是字典?因为我在想,如果它也是熊猫数据框,那么事情可以变得更容易。
    • 它是字典的唯一原因是我喜欢键值对的功能。我没有考虑使用另一个 pandas 数据框作为分析工具。我将对此进行研究,看看它是否可以提高性能和分析能力。谢谢@RockAndRoleCoder
    【解决方案2】:

    这里已经回答了:

    https://stackoverflow.com/a/24516612/6815750

    但举个例子,您可以执行以下操作:

    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
    

    【讨论】:

    • 困难在于,在我当前的数据框中,我没有布尔值“通过/失败”,而是值为 0.006。我正在使用外部字典测试这些值是否通过/失败。
    • 所以要清楚,您的字典包含确定您的数据帧行值是否通过的关键值?
    • 您可以从您的数据框中上传示例行吗?如果行很长,只需将其修剪为 5 列,最终分辨率应该可以根据您的需要进行放大。
    • 您是完全正确的 - 我的字典确定数据框中的行值是“通过”还是“失败”。我实际上找到了一个解决方案,我将在下面发布......也许你可以让我知道你的想法?
    【解决方案3】:

    您可以改用以下方法:

    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, :] 
    

    【讨论】:

    • 我的字典更像是 {'a': 0.005, 'b': 0.26} 有 65 个这样的条目。我的数据框是数千行,其中包含从 csv 读取的值。
    猜你喜欢
    • 2010-10-13
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多