[英]take a list of filters and return all possible combinations
我正在使用熊猫。 我有一个过滤器列表,用作 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)
(filter1, filter2)
通过 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.