###前提・実現したいこと
お世話になります。
以前、下記のような質問をさせていただきました。
以前質問させていただいた物を下記のようにグレードアップしたいと思っています。
例えば,下のようなデータフレームがあるとします。
machine time cost material_ID A 1000 100 1 A 1010 110 2 A 1010 120 2 A 1020 150 3 A 1020 100 1 A 1020 210 1 A 1020 200 2 B 1000 110 2 B 1010 120 2 B 1010 150 3 B 1020 100 1 B 1020 210 2
- machine : 機械の種類
- time:材料が投入される時間。ここでは便宜上、時間データに変換していません。
- cost : ある材料を入れて機械を動かしたときのコスト
- material_ID : 材料の種類
ここで次のようなルールに基づいてデータフレームを操作したいと思います。
- 'machine'と'time'が同じならば'cost'が一番高いものを選び、それ以外の行は削除する。その際に次の2つの列を追加する
-- 'used_material':使用したmaterial_IDを列挙する。2と2のように同じものが重複する場合は一つだけ2と書いておく。(2+2みたいな表示は駄目)
-- 'tax':costに1.08を掛け算する
アウトプットとしては次のようになるはずです。
machine time cost material_ID used_material tax A 1000 100 1 1 108 A 1010 120 2 2 129.6 A 1020 210 1 1+2+3 226.8 B 1000 110 2 2 118.8 B 1010 150 3 2+3 162 B 1020 210 2 1+2 210
###試したこと
知っていることを総動員して、こんな感じで書いてみましたが、うまく行きませんでした。
python
1import pandas as pd 2 3df = pd.DataFrame( 4 {'machine': ['A', 'A', 'A', 'A', 'A', 'A', 'A' ,'B', 'B', 'B', 'B', 'B'], 5 'time': ['1000', '1010', '1010', '1020', '1020', '1020', '1020','1000', '1010', '1010', '1020', '1020'], 6 'cost': [100, 110, 120, 150, 100, 210, 200, 110, 120, 150, 100, 210], 7 'material_ID': [1, 2, 2, 3, 1, 1, 2, 2, 2, 3, 1, 2]}) 8 9df = df.ix[:,['machine','time','cost','material_ID']] 10print(df) 11 12new_df = df.loc[df.groupby('machine')['cost'].idxmin()] 13 14def get_material_ID(row): 15 material_IDs = df.loc[df['machine'] == row['machine'], 'material_ID'] 16 material_IDs = sorted(material_IDs.map(str).values) 17 IDs = ' + '.join(material_IDs) 18 return pd.Series({'used_material': IDs, 'tax': machine['cost']*1.08}) 19 20new_df = pd.concat( [new_df, new_df.apply(get_material_ID, axis=1 )], axis=1 )
どうやら上の書き方では,new_dfの列を関数get_material_IDに渡したときに,'machine'列や'cost'列にアクセス出来ていないみたいです。.ixを使ってみたけど駄目でした。
上の書き方は拘っておりません。これよりうまい書き方があればご教示願います。
またまた申し訳ございませんが、上手い書き方を教えていただければと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。