我的最终目标是找到哪些属性组合最大化价值。 我的计划是首先创建一个键值对的所有可能组合的列表,然后迭代它,为每个属性组合分配相应的值,然后对其进行排序以找到最佳组合。我想找到最有效的方法来做到这一点。
模拟数据框可以这样构建:
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并对值求和。然后,最后我将排序并找到最佳组合以最大化价值。
这显然不是一种非常有效的方法,因为很多这些组合不存在(例如菲亚特卡车),但我想不出任何其他...开放给任何其他建议!
答案 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'}]