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

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

ただいまの
回答率

88.64%

python,pandas同士の部分一致

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,408

bkts94441

score 18

 前提・実現したいこと

現在、機械の一定動作を記録する実験を行っており、計測データ.csvには実験動作のデータが記載されています。
また、計測データ.csvでデータをグラフ化しています。
日付毎に抽出された外れ値や計測失敗データをまとめた表をチェックリスト.xlsxとして作成しました。
次に、チェック対象データを予め分かりやすくするため、チェック対象の日付を違う色で出力することを試みています。

 計測データ.csv

      Unnamed: 0                 DateTime  Operated cycles  hdtemp  \
1              1  2018-03-08 19:53:38.590       -2224389.0     0.0   
36            36  2018-03-09 18:19:22.260       -2205153.0    32.1   
133          133  2018-03-16 14:02:03.760       -1965408.0    56.8   
242          242  2018-03-17 02:02:08.130       -1929389.0    58.9   
336          336  2018-03-17 14:02:07.820       -1893374.0    58.7    
         ...                      ...              ...     ...   

6114        6114  2018-04-16 14:02:10.810         -79607.0    40.6   
6201        6201  2018-04-17 02:02:11.640         -63454.0    51.6   
6295        6295  2018-04-17 14:02:15.340         -43630.0    49.3   
6390        6390  2018-04-18 02:02:12.070         -23799.0    53.2   
6485        6485  2018-04-18 14:02:15.750          -3975.0    50.9   

                 count_velocity  mean_velocity
1                      3287.0           104.510044
36                     3286.0           104.511719
133                    3289.0           104.595172 
242                    3290.0           104.485199
336                    3292.0           104.495872   
                      ...                   ...
6114                   3280.0           104.503950   
6201                   3279.0           104.501253
6295                   3280.0           104.500587  
6390                   3268.0           104.511174   
6485                   3296.0           104.493659 

 外れ値チェックリスト.xlsx

         Date  sampleA
8  2018-03-09   not
15 2018-03-16   not
16 2018-03-17   not
17 2018-03-18   not
18 2018-03-19   not
...   ...       ...
14 2018-04-15   not
15 2018-04-16   not
16 2018-04-17   not
17 2018-04-18   not
18 2018-04-19   not

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

グラフ出力する際、計測データ.csvのX軸を"Operated cycles列",
Y軸を"mean_velocity列" 又は"count_velocity列" に設定してグラフを出力しています。
今回行いたいことは、計測データ.csvの"DateTime列"と外れ値チェックリスト.xlsxの"Date列"の日付が同じ月日であれば"Date列"と"DateTime列"が一致する日付の行へとdataframeを結合させたいのですがどのようにすればよろしいでしょうか。

 質問追記 2018/11/12

 変更後,外れ値チェックリスト.xlsx

                  Date        sampleA
1  2018-03-08  19:12:22            NaN
36 2018-03-09  18:20:30             ok
133 2018-03-10 14:00:00             ok
242 2018-03-10 02:02:11          empty
336 2018-03-11 14:00:00             ok
..                 ...             ...
6114 2018-04-17 14:20:31            ok
6201 2018-04-18 02:00:00            ok
6295 2018-04-18 14:03:02            ok
6390 2018-04-19 02:00:00            ok
6485 2018-04-19 14:20:30            ok


上記のチェックリスト.xlsxファイルの仕様が変更し、時刻を追加することになりました。
時刻が2時台と14時台は問題無く計測出来ていると判断していますが、稀に他の時間帯で計測しているデータがあります。また、2時台と14時台の時刻が完全に一致していないこともあり、計測データ.csvをdf["DateTime"].dt.hourで時間のみ抽出して結合を試みて、series型で返ってきた"DateTime"を再度結合してからもう一度DataFrame化をしたら下記のようになりました。どうにかして分秒を除いて時間のみでpd.mergeを行いたいのですが何か良い方法はありますでしょうか。再度質問をして恐れ入りますがご回答よろしくお願い致します。

                  DateTime            Operated cycles          sampleA
1    1970-01-01 00:00:00.000000019       -2224389.0                6.809720
36   1970-01-01 00:00:00.000000018       -2205153.0                9.529389
133  1970-01-01 00:00:00.000000014       -1965408.0                4.865321
242  1970-01-01 00:00:00.000000002       -1929389.0                3.787791
336  1970-01-01 00:00:00.000000014       -1893374.0                6.848335
432  1970-01-01 00:00:00.000000002       -1857366.0                7.682003
528  1970-01-01 00:00:00.000000014       -1821352.0                5.676905
624  1970-01-01 00:00:00.000000002       -1785344.0                8.802663
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2018/10/30 14:21

    質問の内容が理解できません。 "計測データ.csv"は、何らかの計測データが入っているCSVファイル。"チェックリスト.xlsx"は、除外すべきデータに関するデータが入っているExcelファイル。ここまでは分かるのですが、これらのファイルにどんなデータが含まれているのか、"結合"というのは何をすることなのか、突然出てきた"出力データ.csv"とは何か、「日付を部分一致などで」の"など"は何を含むのか、といった部分が理解できません。

    キャンセル

  • bkts94441

    2018/10/30 14:23

    説明不足で申し訳ございません、訂正致します。

    キャンセル

回答 1

checkベストアンサー

+1

計測データの DateTime列より Date列 を生成し、2つのDataFrameを Date列にて結合(pd.merge())すると良いかと思います

以下、サンプル(データはかなり簡略化されております)

import pandas as pd

# 計測データ (DateTime列はDatetime型)
dfA = pd.DataFrame({
    'DateTime': ['2018-03-08 19:53:38.590',
                 '2018-03-09 18:19:22.260',
                 '2018-03-16 14:02:03.760'],
    'Operated cycles': [-2224389.0,-2205153.0,-1965408.0],
    'hdtemp': [0.0, 32.1,56.8]})
dfA['DateTime'] = pd.to_datetime(dfA['DateTime'])

# 外れ値リスト (Date列はDatetime型)
dfB = pd.DataFrame({
    'Date' : ['2018-03-09', '2018-03-16', '2018-03-17'],
    'sampleA' : ['not', 'not', 'not']
})
dfB['Date'] = pd.to_datetime(dfB['Date'])


# DfA に Date列を追加(DateTime列より生成)
dfA['Date'] = dfA['DateTime'].dt.normalize()
# DfA と DfB を Date列にて結合
ret = pd.merge(dfA, dfB, on='Date', how='left')
print(ret)
#                 DateTime  Operated cycles  hdtemp       Date sampleA
#0 2018-03-08 19:53:38.590       -2224389.0     0.0 2018-03-08     NaN
#1 2018-03-09 18:19:22.260       -2205153.0    32.1 2018-03-09     not
#2 2018-03-16 14:02:03.760       -1965408.0    56.8 2018-03-16     not

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/12 20:48

    df['Date'] = df['Date'].apply(lambda dt: dt.replace(minute=0, second=0))
    で、時・分を0にできるかと思いますがどうでしょうか

    キャンセル

  • 2018/11/13 10:13

    返事が遅れてしまい申し訳ございません。ご回答いただいた通り実行してみたら理想通りの結果が出力されました。再びご回答いただき感謝しております。

    キャンセル

  • 2018/11/13 14:31

    何度も申し訳ございません。つかぬ事をお伺いいたしますが、チェックリスト.xlsxの仕様上、計測ミスの時間が12時以内の時間帯を(hour=2)、13時以上24時以内の時間帯を(hour=14)と置換するべく、条件分岐の方法を調べていたのですがpandasでのdatetimeの条件分岐を調べてもわからなかったので、差支えなければ教えていただけないでしょうか。申し訳ございませんがよろしくお願い致します。

    キャンセル

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

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

関連した質問

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