【问题标题】:pandas filter using combinations of boolean series使用布尔系列组合的熊猫过滤器
【发布时间】:2022-01-25 23:24:30
【问题描述】:

我有 7 个等长的布尔序列:

msk_valid_structure
msk_submission_context
msk_reference_substance_location
msk_neutral
msk_identifier_origin
msk_two_conversion_methods
msk_no_error_warnings

我需要将它们与逻辑 AND (&) 结合起来,这样:

  • 我们总是包含第一个 (msk_valid_structure)
  • 我们包括了其余 6 个中的 5 个(所有组合)

我尝试了两种解决方案,但都不满意。

第一个使用reduce,速度很慢:

from itertools import combinations
from functools import reduce
for combination in combinations(msks, 5):
    res = reduce(lambda x,y: x&y, combination, msk_valid_structure)

第二个构造的数据帧也很慢:

from itertools import combinations
for combination in combinations(msks, 5):
    tmp = pd.DataFrame({i: col for i, col in enumerate(list(combination) + [msk_valid_structure])})
    res = tmp.all(axis='columns')

你会如何处理这种情况?

非常感谢您的帮助。

【问题讨论】:

  • 通常在循环中创建和/或附加较大的 DataFrame 会非常慢。如何创建一个基本的 Python 数据结构,然后将其全部加载到循环外的最终 DataFrame 中?

标签: python pandas


【解决方案1】:

从您的系列中生成一个 DataFrame,然后使用 apply。在这里,您可以编写自定义函数来添加结果有效/无效的列,或者如果满足条件,则直接执行某些操作。

这种方式的好处是,它矢量化并且与循环相比有点快

与:

import pandas as pd

# Creating dataframe
test=[[0,   0,  1,  0,  0,  1,  1],
      [1,   0,  1,  0,  1,  0,  1],
      [0,   1,  0,  1,  1,  1,  1],
      [1,   1,  0,  1,  1,  1,  1]]

cols = ['msk_valid_structure',
        'msk_submission_context',
        'msk_reference_substance_location',
        'msk_neutral',
        'msk_identifier_origin',
        'msk_two_conversion_methods',
        'msk_no_error_warnings']

df_test = pd.DataFrame(test, columns=cols)

# Defining function matching your condition
def your_func(s: pd.Series):
    valid_stucture = s.msk_valid_structure
    # Because any combination, i just summed Trues
    # if you only allow specific combinations just write conditions here with .col or ['col'] notation
    rest = s.iloc[1:].sum()
    if valid_stucture and (rest >= 5):
        return 1
    return 0

# Applying the function and saving results in foo
df_test['foo'] = df_test.apply(lambda x: your_func(x), axis=1)

# Result of foo:
0,0,0,1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2018-02-22
    • 2020-05-14
    • 1970-01-01
    • 2019-01-14
    • 2016-01-15
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多