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

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

ただいまの
回答率

87.90%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,480

score 15

 前提・実現したいこと

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

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

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

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

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

エラーメッセージ

 該当のソースコード

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

 試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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

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

import pandas as pd

df = pd.DataFrame([[12,'13:00','14:00',3],
                   [12,'13:15','13:30',4],
                   [12,'13:30','13:45',3],
                   [12,'13:35','15:00',4],
                   [12,'14:55','15:00',4]],
                  columns=['日付','入店時間','退店時間','席番号'])

df['入店時間'] = pd.to_datetime(df['入店時間'])
df['退店時間'] = pd.to_datetime(df['退店時間'])

# 日付ごとに処理
for day, day_df in df.groupby('日付'):
    lst = []
    for idx, row in day_df.iterrows():
        lst.append(pd.Series(row['席番号'], index = pd.date_range(row['入店時間'], row['退店時間'], freq='1min')))
    # 日付を表示
    print("{}日".format(idx))
    # タイムテーブルを生成
    time_table = pd.concat(lst, axis=1)
    time_table.index = time_table.index.strftime('%H:%M')
    # 重複がある時間のみ抽出
    time_table = time_table[(time_table.apply(pd.value_counts, axis=1)>1.0).any(axis=1)]
    # 重複があるデータ以外は削除
    time_table = time_table.apply(lambda d: d[d.duplicated(keep=False) & d.notna()], axis=1)
    print(time_table)

#4日
#         0    2    3    4
#13:30  3.0  3.0  NaN  NaN
#13:31  3.0  3.0  NaN  NaN
#13:32  3.0  3.0  NaN  NaN
#13:33  3.0  3.0  NaN  NaN
#13:34  3.0  3.0  NaN  NaN
#13:35  3.0  3.0  NaN  NaN
#13:36  3.0  3.0  NaN  NaN
#13:37  3.0  3.0  NaN  NaN
#13:38  3.0  3.0  NaN  NaN
#13:39  3.0  3.0  NaN  NaN
#13:40  3.0  3.0  NaN  NaN
#13:41  3.0  3.0  NaN  NaN
#13:42  3.0  3.0  NaN  NaN
#13:43  3.0  3.0  NaN  NaN
#13:44  3.0  3.0  NaN  NaN
#13:45  3.0  3.0  NaN  NaN
#14:55  NaN  NaN  4.0  4.0
#14:56  NaN  NaN  4.0  4.0
#14:57  NaN  NaN  4.0  4.0
#14:58  NaN  NaN  4.0  4.0
#14:59  NaN  NaN  4.0  4.0
#15:00  NaN  NaN  4.0  4.0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る