在pandas数据帧中查找属性组合的最佳过滤器以最大化值列

时间:2018-03-25 18:10:39

标签: python-3.x pandas statistics combinations itertools

我的最终目标是找到哪些属性组合最大化价值。 我的计划是首先创建一个键值对的所有可能组合的列表,然后迭代它,为每个属性组合分配相应的值,然后对其进行排序以找到最佳组合。我想找到最有效的方法来做到这一点。

模拟数据框可以这样构建:

brand = ['Ford', 'Fiat', 'Mercedes', 'Ford']
color = ['Red', 'Red' , 'Green', 'Blue']
model = ['Berline', 'Berline', 'Berline', 'truck']
engine_size = [2.0, 1.8, 1.5, 3.5]
made_in = ['Europe', 'Europe', 'Europe', 'Europe']
value = [100,250,60,80]
data = pd.DataFrame({'brand': brand, 'color': color, 'model': model, 'engine_size':engine_size, 'made_in': made_in, 'value':value})

我删除只有一个值的列:

cols_to_drop = [i for i in data.columns if len(set(data[i]))==1]
data.drop(cols_to_drop, axis=1, inplace=True)

Alll可能的列组合如下所示:

[('brand',),
 ('color',),
 ('engine_size',),
 ('model',),
 ('brand', 'color'),
 ('brand', 'engine_size'),
 ('brand', 'model'),
 ('color', 'engine_size'),
 ('color', 'model'),
 ('engine_size', 'model'),
 ('brand', 'color', 'engine_size'),
 ('brand', 'color', 'model'),
 ('brand', 'engine_size', 'model'),
 ('color', 'engine_size', 'model')]

我使用itertools找到了上面的列表:

import itertools
combos = []
for length in range(0, len(data)):
    for subset in itertools.combinations(data, length):
        combos.append(subset)

我需要找到一种方法来创建一个列表,找到所有可能的列:嵌套在所有这些列组合中的值组合。

如果我们以('品牌','型号')为例,那么它应该看起来像这样:

[{'brand': 'Ford', 'model': 'Berline'}, {'brand':'Fiat', 'model':'Berline'}, {'brand':'Mercedes', 'model: 'Berline'}, {'brand':'Ford', 'model':'truck'}, {'brand':'Fiat', 'model':'truck'}, {'brand': 'Mercede', 'model':'truck'}]

我希望每行都有这个,然后扁平化,这将是一个单词列表。然后我可以遍历每个字典,在每次迭代时过滤掉df并对值求和。然后,最后我将排序并找到最佳组合以最大化价值。

这显然不是一种非常有效的方法,因为很多这些组合不存在(例如菲亚特卡车),但我想不出任何其他...开放给任何其他建议!

1 个答案:

答案 0 :(得分:0)

我正在为merge

创建一个新密钥
data['key']=1
data[['brand','key']].merge(data[['model','key']]).drop_duplicates().drop('key',1).to_dict('r')

Out[1000]: 
[{'brand': 'Ford', 'model': 'Berline'},
 {'brand': 'Ford', 'model': 'truck'},
 {'brand': 'Fiat', 'model': 'Berline'},
 {'brand': 'Fiat', 'model': 'truck'},
 {'brand': 'Mercedes', 'model': 'Berline'},
 {'brand': 'Mercedes', 'model': 'truck'}]