##前提・実現したいこと
いつもお世話になっております。データフレームの取扱が分からず、質問させていただきます。
次の2つのCSVファイルがあるとします。
(本当はソースコードの中でデータフレームとして定義した方が答えやすいのですが,
pandas.DataFrameからdate_parserが呼び出せない?(違ったらスミマセン)ので
CSVからデータフレームを作成したことにしています)
・machine.csv
次のものが機械が特定の動作をする時間を記録したものとします。
左のmachine列が機械の種類、time列が特定の動作をする時間です。
//machine.csv machine,time A,10:00:00 A,10:00:05 A,10:00:10 A,10:00:15 A,10:00:25 B,10:00:05 B,10:00:15 B,10:00:20
・material.csv
次のCSVが材料の投入時間を記録したものです。
time列が投入する時間,machine列が投入先の機械です。
//material.csv time,machine 10:00:01,A 10:00:07,A 10:00:09,B 10:00:15,B 10:00:24,B
ここで実現したい事がやや複雑なので箇条書します
- machine.csvにresult列を追加する
- machine.csvのtime列とmaterial.csvの各行のtime列を比較し、
- 「material.csvの時間がmachine.csvの時間より後で一番近い時間」
- 且つ「material.csvの時間とmachine.csvの時間が5分以内」
- 且つ「機械の種類が一致する」
ものがあればresult列にmaterial.csvの時間を書き込む
- 条件に合うものがなければNonを代入する
という操作をしたいと思っています。
アウトプットは次のようになります。
//RESULT DataFrame machine,time,result A 10:00:00 10:00:01 A 10:00:05 10:00:07 A 10:00:10 Non A 10:00:15 Non A 10:00:25 Non B 10:00:05 10:00:09 B 10:00:15 10:00:15 B 10:00:20 10:00:24
Forループを物凄い駆使すれば出来なくはないかもしれませんが、ちょっと大変です。
良いテクニックがあればご教示おねがいします。
##試したこと
applyやmapを使って出来ないかと試行錯誤しましたが,applyやmapは2列をサブルーチンに渡すことが出来ないみたいなので(これも間違っていたら済みません)途方にくれてしまいました。
python
1import pandas as pd 2 3# パーサーを定義する 4my_parser = lambda x: pd.datetime.strptime(x, '%H:%M:%S') 5 6# ファイルを読み込む 7df_mach = pd.read_csv('machine.csv', date_parser=my_parser) 8df_mate = pd.read_csv('material.csv', date_parser=my_parser) 9 10def func(valu): 11####### 12# ここの書き方が分からない 13####### 14 return ## 15 16df_mach['result'] = df_mach['time'].map(func) 17 18print(df_mach)
結局Forループなどを駆使して複雑な処理をしないと実現できないのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/29 13:00
2017/01/29 14:17
2017/02/02 12:30