获取筛选器列表并返回所有可能的组合



我正在使用熊猫。我有一个过滤器列表,用作dataframe.loc[filter,:]的一部分,例如。

df = pd.DataFrame(np.random.choice([True, False], size=[10,8]))
filter1 = df[1] == True
filter2 = df[5] == False
filter3 = (df[2] == True) & (df[7] == False)
filters = [filter1, filter2, filter3]

如何生成所有可能的过滤器组合的列表/字典? 例如。

{combination_1 : (filter_1),
combination_2 : (filter_1 & filter_2),
combination_3 : (filter_1 & filter_3),
combination_4 : (filter_1 & filter_2, & filter_3),
etc.}

这样我就可以遍历列表并将不同的函数应用于每个组合的数据帧。我想这样做,这样我就可以根据滤镜的组合以不同的颜色突出显示每一行。

我写了一个函数来生成一个十六进制字符串:

def hex_string(filter_1, filter_2, filter_3):
bool_list = [filter_1, filter_2, filter_3]
hex_list = ["FF" if value else "00" for value in bool_list]
string = f"#{''.join(hexlist)}"
return string

这个想法是,我将使用如下所示的函数来设置数据帧的样式

def highlight_rows(dataframe):
df = dataframe.copy()
iterable = combination_generator_function(filter_list)
for combination in iterable:
df.loc[combination,:] = "background-color:{hex_string(combination)}"
return df
df.style.apply(highlight_rows, axis=None)

我觉得这应该比我想象的要容易得多。是否可以在不键入每个单独的组合和与之配套的十六进制字符串的情况下执行此操作?

这是否有效:

from itertools import combinations
from functools import reduce
filter_combos = [
reduce(lambda x, y: x & y, combo)
for i in range(1, len(filters) + 1)
for combo in combinations(filters, i)
]

举例说明:combinations(filters, 2)给你元组

(filter1, filter2), (filter1, filter3), (filter2, filter3)

并且reduce(lambda x, y: x & y, combo)通过 lambda 函数将元组(如(filter1, filter2))"减少"为filter1 & filter2。(reduce从左到右累积工作,即它不仅适用于具有 2 个元素的元组。对于只有一个元素的元组,它只返回该元素。

我认为itertools是一个很好的解决方案。

import itertools  
filters = [filter_1, filter_2, filter_3]  
combinationList = []
for i in range(len(filters)):  
combinationList += list(itertools.permutations(filters,i+1))
print(combinationList) #Probably cant print the filters, but combinationList is the list off all possible combinations from 1-3 filters per combination

最新更新