###前提・実現したいこと
お世話になります。以前の質問から派生して、下記のようなことを実現したいと思います。
- 機械が稼働する時間のデータ(machine.csv)とある時間に投入される材料データ(material.csv)がある
- (machine.csv)の['machine']はその時間に稼働している機械のID,['time']はその時間を意味している
- 材料データ(material.csv)の['time']は材料が投入される時間,['machine']は投入される機械,['material']は投入される材料のIDを意味している
- machine.csvのデータ(データフレーム内の['machine'])と時間(データフレーム内の['time'])に対応する材料のIDを抜き出す
- ただし,機械が稼働する時間から後5秒に投入される材料をすべて列挙する。例えば(machine.csv)のA,10:00:00に対応する(material.csv)は,10:00:00,A,{'id': 'x001'},10:00:01,A,{'id': 'x001'}。ただし材料IDが重複するので削除したい
csv
1//machine.csv 2machine,time 3A,10:00:00 4A,10:00:02 5C,10:00:03 6C,10:00:04 7A,10:00:05 8B,10:00:08 9B,10:00:10 10B,10:00:12 11A,10:00:15 12A,10:00:16 13A,10:00:17 14A,10:00:18 15B,10:00:19 16B,10:00:20 17B,10:00:22
//material.csv time,machine,material 10:00:00,A,{'id': 'x001'} 10:00:01,A,{'id': 'x001'} 10:00:03,B,{'id': 'x002'} 10:00:05,B,{'id': 'x002'} 10:00:06,B,{'id': 'x001'} 10:00:08,A,{'id': 'x001'} 10:00:09,A,{'id': 'x001'} 10:00:11,B,{'id': 'x003'} 10:00:12,B,{'id': 'x003'} 10:00:13,B,{'id': 'x003'} 10:00:14,A,{'id': 'x001'} 10:00:16,A,{'id': 'x003'} 10:00:18,B,{'id': 'x001'} 10:00:19,B,{'id': 'x002'} 10:00:20,B,{'id': 'x002'} 10:00:22,A,{'id': 'x001'} 10:00:23,A,{'id': 'x001'} 10:00:24,B,{'id': 'x001'} 10:00:25,B,{'id': 'x002'} 10:00:26,B,{'id': 'x002'} 10:00:27,A,{'id': 'x001'} 10:00:28,A,{'id': 'x001'} 10:00:29,B,{'id': 'x001'} 10:00:30,B,{'id': 'x001'} 10:00:31,B,{'id': 'x001'} 10:00:32,A,{'id': 'x003'} 10:00:33,A,{'id': 'x003'} 10:00:35,B,{'id': 'x001'} 10:00:37,B,{'id': 'x001'} 10:00:39,B,{'id': 'x001'}
###試したこと・該当のソースコード
以前教えていただいたコードを改造して下記のように作りました
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 10# 検索用に DateTime 型の列を追加した material を作成する 11df_mate_ = df_mate.assign(time_=lambda s: pd.to_datetime(s.time)) 12 13def func(row): 14 # DateTime 型に変換する 15 time_ = pd.to_datetime(row.time) 16 # 条件が一致する material を探す 17 matches = df_mate_[(df_mate_.machine == row.machine) & 18 (df_mate_.time_ >= time_) & 19 (df_mate_.time_ <= (time_ + pd.tseries.offsets.Second(5)))] 20 # 重複削除 21 use_m = matches.drop_duplicates(['material'])['material'] 22 print(use_m) 23 return None if matches.empty else use_m # <--ここがおかしい? 24 25df_mach['result'] = df_mach.apply(func, axis='columns') 26 27print(df_mach)
###発生している問題・エラーメッセージ
下記のようなメッセージが出ます.
ValueError: Wrong number of items passed 12, placement implies 1
さらに
python
1return None if matches.empty else use_m # <--ここがおかしい?
を
python
1return None if matches.empty else 1 # <--ここがおかしい?
とすると当然エラーは出なくなります。
お手数ですが、良い方法があればご教示願います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/25 14:23 編集
2017/05/23 11:29
2017/05/24 07:06
2017/05/25 14:31 編集