質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3174閲覧

#時間帯の重複を抽出したい

fute4058

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2018/10/23 08:00

前提・実現したいこと

pythonでこのようなdataframeがあります。

日付 入店時間 退店時間 席番号
12 13:00 14:00 3
12 13:15 13:30 4
12 13:30 13:45 3
... ... ... ...

この中から、同じ席番号に滞在しているにもかかわらず
滞在時間帯が被ってしまっている行(上の場合、3行目)を抽出したいです。

発生している問題・エラーメッセージ

現在のソースコードだと
処理が永遠に終わりません。。。
このような場合、どのようなコードがいいのか
教えていただきたいです

エラーメッセージ

該当のソースコード

python

1for i in range(len(df)): 2 for j in range(i+1,len(df)): 3 if df.iloc[i,3] == df.iloc[j,3]: 4 if df.iloc[i,1] < df.iloc[j,1] <df.iloc[i,2]: 5 tmp = df.iloc[j,:] 6 df_dup = df_dup.append(tmp)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

magichan👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

面白そうなのでやってみました。
縦軸を時間、横軸を客(index)として1分ごとのタイムテーブルを作成して、同時刻に同じ席に2人以上のデータがないかを確認しています。

比較演算がないので、データがメモリに乗りさえすればそれほど遅くならないかと思います。

タイムテーブルはとりあえず1分ごとにしておりますが、データによってはもう間引くことができるのではないでしょうか。

また結果の出力形式はあまり考えずに、重複した箇所を全部出力しておりますが、あとはDataFrameを変換するだけなのでどうにでもなるかと思います。

Python

1import pandas as pd 2 3df = pd.DataFrame([[12,'13:00','14:00',3], 4 [12,'13:15','13:30',4], 5 [12,'13:30','13:45',3], 6 [12,'13:35','15:00',4], 7 [12,'14:55','15:00',4]], 8 columns=['日付','入店時間','退店時間','席番号']) 9 10df['入店時間'] = pd.to_datetime(df['入店時間']) 11df['退店時間'] = pd.to_datetime(df['退店時間']) 12 13# 日付ごとに処理 14for day, day_df in df.groupby('日付'): 15 lst = [] 16 for idx, row in day_df.iterrows(): 17 lst.append(pd.Series(row['席番号'], index = pd.date_range(row['入店時間'], row['退店時間'], freq='1min'))) 18 # 日付を表示 19 print("{}日".format(idx)) 20 # タイムテーブルを生成 21 time_table = pd.concat(lst, axis=1) 22 time_table.index = time_table.index.strftime('%H:%M') 23 # 重複がある時間のみ抽出 24 time_table = time_table[(time_table.apply(pd.value_counts, axis=1)>1.0).any(axis=1)] 25 # 重複があるデータ以外は削除 26 time_table = time_table.apply(lambda d: d[d.duplicated(keep=False) & d.notna()], axis=1) 27 print(time_table) 28 29#4日 30# 0 2 3 4 31#13:30 3.0 3.0 NaN NaN 32#13:31 3.0 3.0 NaN NaN 33#13:32 3.0 3.0 NaN NaN 34#13:33 3.0 3.0 NaN NaN 35#13:34 3.0 3.0 NaN NaN 36#13:35 3.0 3.0 NaN NaN 37#13:36 3.0 3.0 NaN NaN 38#13:37 3.0 3.0 NaN NaN 39#13:38 3.0 3.0 NaN NaN 40#13:39 3.0 3.0 NaN NaN 41#13:40 3.0 3.0 NaN NaN 42#13:41 3.0 3.0 NaN NaN 43#13:42 3.0 3.0 NaN NaN 44#13:43 3.0 3.0 NaN NaN 45#13:44 3.0 3.0 NaN NaN 46#13:45 3.0 3.0 NaN NaN 47#14:55 NaN NaN 4.0 4.0 48#14:56 NaN NaN 4.0 4.0 49#14:57 NaN NaN 4.0 4.0 50#14:58 NaN NaN 4.0 4.0 51#14:59 NaN NaN 4.0 4.0 52#15:00 NaN NaN 4.0 4.0

投稿2018/10/23 12:28

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードを書くのが面倒なので、疑似コードを。

while リスト中のデータがなくなるまで繰り返す 一番初めのデータを取得する(1) (1)のデータに重複するデータをリストから取得する(2) (1)と(2)をセットにして保持する (1)と(2)のデータをリストから削除する

こんな感じで、セットをため込みます。
これで、重複するデータが得られるはずです。

投稿2018/10/23 08:15

編集2018/10/23 08:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問