python - 从 Dataframe 为运输模型制作字典
问题描述
我有这个数据框来解决运输问题。
Unnamed: 0 Unnamed: 1 c1 c2 c3 c4 c5 capacity
0 NaN p1 4 5 6 8 10 500.0
1 NaN p2 6 4 3 5 8 500.0
2 NaN p3 9 7 4 2 4 500.0
3 demand NaN 80 270 250 160 180 NaN
我已经像这样更改了列名,
df.columns = ['Demand', 'Plant', 'c1', 'c2', 'c3', 'c4', 'c5', 'capacity']
我想做一本这样的字典,
d = {c1:80, c2:270, c3:250, c4:160, c5:180} # customer demand
M = {p1:500, p2:500, p3:500} # factory capacity
I = [c1,c2,c3,c4,c5] # Customers
J = [p1,p2,p3] # Factories
cost = {(p1,c1):4, (p1,c2):5, (p1,c3):6,
(p1,c4):8, (p1,c5):10, ......
}
对于第一种情况,我使用了以下代码,
M = df.set_index('Plant')['capacity'].to_dict()
它给我,
{'p1': 500.0, 'p2': 500.0, 'p3': 500.0, nan: nan}
我不想要任何 NaN 值。请帮助以没有 NaN 的通用方式查找这本总字典(d、M 和成本)。
解决方案
df1 = df.set_index(["Unnamed: 0", "Unnamed: 1"])
plants = df1.loc[np.NaN] # remove demand from dataframe
d = dict(df1.loc["demand"].T.squeeze().dropna().iteritems())
M = dict(plants["capacity"].iteritems())
I = list(plants.drop(columns="capacity").columns)
J = list(plants.index)
cost = dict(plants.drop(columns="capacity").stack().iteritems())
>>> d
{'c1': 80.0, 'c2': 270.0, 'c3': 250.0, 'c4': 160.0, 'c5': 180.0}
>>> M
{'p1': 500.0, 'p2': 500.0, 'p3': 500.0}
>>> I
['c1', 'c2', 'c3', 'c4', 'c5']
>>> J
['p1', 'p2', 'p3']
>>> cost
{('p1', 'c1'): 4,
('p1', 'c2'): 5,
('p1', 'c3'): 6,
('p1', 'c4'): 8,
('p1', 'c5'): 10,
('p2', 'c1'): 6,
('p2', 'c2'): 4,
('p2', 'c3'): 3,
('p2', 'c4'): 5,
('p2', 'c5'): 8,
('p3', 'c1'): 9,
('p3', 'c2'): 7,
('p3', 'c3'): 4,
('p3', 'c4'): 2,
('p3', 'c5'): 4}
推荐阅读
- java - weblogic.application.ModuleException:java.io.FileNotFoundException
- java - Android Studio 布局被压缩
- api - 在 golang 中以编程方式访问 RPM api/调用
- java - 具有可变维度的参数
- php - 为页面设置特定的持续时间
- reactjs - 我如何将组件引用传递给 redux 商店
- laravel - 我应该在 Laravel 的多个模型中使用什么雄辩的关系
- reactjs - 使用 Graphql、React 映射函数
- visual-studio - svsnversion.exe 在 Visual Studio 中重新生成解决方案时引发错误
- codeigniter - 如何在codeigniter的输入类型文本框中显示Select - where条件值