pythonで最適化問題(?)を考えております。
data.csv
id,id2,cost
1,10,5
2,10,3
3,10,1
1,13,10
2,13,5
3,13,4
1,18,1
2,18,5
3,18,10
1,20,10
2,20,5
3,20,4
1,25,10
2,25,1
3,25,5
list.csv
id2,min
10,
13,
18,
20,
25,
29,
35,
48,
上記のdata.csvとlist.csvでdata.csvのid2に着目してcostが最小となる値をlist.csvのminに出力するスクリプトは以下で表せると思います。
python
1import pandas as pd 2 3df = pd.read_csv("data.csv") 4 5conv = df.groupby("id2")["cost"].min() 6 7df1 = pd.read_csv("list.csv") 8ret = df1["id2"].map(conv) 9 10df1["min"] = ret 11print(df1)
ここで、id2がminを取る時のdata.csvのid(1,2,3)にも着目し、同じid番号を取れる回数に制限を設け(id:1⇒2回、id2⇒2回、id3⇒1回)、最小値を取るid番号が制限に達した場合、そのidの時にminを取る場合であっても、制限に達していないidのうちから最小値を選択するようにするにはどのように変更したらよいでしょうか。
list.csv
id2,min
10,1
13,5
18,1
20,5
25,10
29,
35,
48,
のように出力したいです。
id2が10の時は最小値が1なのでlist.csvのminには1が出力されます。
(この時のidは3⇒制限回数1回に達したので最小値であってもidが3のものは、これ以降使用できない)
id2が13の時の最小値は4ですが、id3のものは使用できない為、2番目に小さい5をlist.csvのminに出力します。(この時のidは2)
(最後の方になると、使用できるidの制限でmaxがlist.csvのminに出力されることもあり得ます。。。)
このようにlist.csvの上から5番目までこの動作を繰り返すにはどのように変更したらよろしいでしょうか。
なお、list.csvの6番目以降のminに関しては出力しなくて結構です。(id:1,2,3の制限の合計が5である為、6番目以降は全てのidが制限に達する為です。)
ご教授いただけましたら幸いです。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。