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

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

ただいまの
回答率

90.98%

  • Python 3.x

    4120questions

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

  • Jupyter

    129questions

timestamp列に対する条件抽出について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 120

jun.k

score 18

データフレームdfaの日付を表示する列Dateに対して、条件に合致する日があった場合は1とし、該当しなければ0とする新たな列sbを作りたいのですが、日付を認識しないのかすべて0になってしまいます。

○加工前のデータ(下記コード2行目 dfa.head()の結果)
Store     Dept     Date          Weekly_Sales     IsHoliday
0     1     1     2010-02-05     24924.50     False
1     1     1     2010-02-12     46039.49     True
2     1     1     2010-02-19     41595.55     False
3     1     1     2010-02-26     19403.54     False
4     1     1     2010-03-05     21827.90     False

○作ったコード
dfa=pd.read_csv('train.csv')
dfa.head()
dfa['Date']=pd.to_datetime(dfa['Date'])

s1=datetime.strptime('2010-2-12','%Y-%m-%d')
s2=datetime.strptime('2011-2-11','%Y-%m-%d')
s3=datetime.strptime('2012-2-10','%Y-%m-%d')
s1=datetime.strptime('2010-2-12','%Y-%m-%d')

dfa['SuperBowl']=np.where(dfa['Date']==s1,1,0)
dfa['SuperBowl']=np.where(dfa['Date']==s2,1,0)
dfa['SuperBowl']=np.where(dfa['Date']==s3,1,0)

dfa.head()

○上記コード実行後

Store     Dept     Date           Weekly_Sales     IsHoliday     SuperBowl
0     1     1     2010-02-05     24924.50       False          0
1     1     1     2010-02-12     46039.49       True          0
2     1     1     2010-02-19     41595.55       False          0
3     1     1     2010-02-26     19403.54       False          0
4     1     1     2010-03-05     21827.90       False          0

どのようにすれば日付を条件文で認識してくれるのでしょうか

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2018/01/11 11:28

    0無しの日付文字列と、0埋めされた日付文字列を比較したいということでしょうか?あと、正しいコードを書いて下さい。(手打ちではなくコピペして下さい)

    キャンセル

  • jun.k

    2018/01/11 12:18

    分かりにくくてすみません。コードをアップしました。がその最中にdf['SuperBowl']が上書きされて初めの条件が消えているのに気づきました・・・

    キャンセル

  • jun.k

    2018/01/11 12:29

    dfa['SuperBowl']~始まる行を dfa['SuperBowl']=np.where(((dfa['Date']==s1) or (dfa['Date']==s2) or (dfa['Date']==s3)),1,0) に変えましたがうまくいきませんでした

    キャンセル

回答 4

+2

機能しない原因は

dfa['SuperBowl']=np.where(dfa['Date']==s1,1,0)


の結果を

dfa['SuperBowl']=np.where(dfa['Date']==s3,1,0)


にて上書きしているからではないでしょうか。

とりあえずは

dfa['SuperBowl']=np.where(dfa['Date']==s1,1,0)
dfa['SuperBowl']=np.where(dfa['Date']==s2,1,0)
dfa['SuperBowl']=np.where(dfa['Date']==s3,1,0)


の部分を

dfa['SuperBowl_1']=np.where(dfa['Date']==s1,1,0)
dfa['SuperBowl_2']=np.where(dfa['Date']==s2,1,0)
dfa['SuperBowl_3']=np.where(dfa['Date']==s3,1,0)


のように別のColumnに書き出すようにしてみてください

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/11 12:43

    ありがとうございました。なるべく複数カラムにしたくなかったので、fuzzball様とのやりとりどおりwhereで複数条件を入れようとしたのですがうまくいきませんでした。 ただ調べたところorではなく|で並べることが分かりましたので解決できました。

    キャンセル

+1

dfa['SuperBowl'] = 0
dfa.loc[dfa['Date']==s1, ‘SuperBowl’] = 1
dfa.loc[dfa['Date']==s2, ‘SuperBowl’] = 1
dfa.loc[dfa['Date']==s3, ‘SuperBowl’] = 1

条件式はisinで一気に評価できます。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/11 12:53

    ありがとうございます。これでもできますね(すみません、ご回答いただく前に下記解決できました)。

    キャンセル

check解決した方法

0

皆様ありがとうございます。
皆様からのご助言を元に色々試行錯誤しているうちに下記コードで解決できました。

【変更前】
dfa['SuperBowl']=np.where(dfa['Date']==s1,1,0)
dfa['SuperBowl']=np.where(dfa['Date']==s2,1,0)
dfa['SuperBowl']=np.where(dfa['Date']==s3,1,0) 

【変更後】
dfa['SuperBowl']=np.where((dfa['Date']==s1)|(dfa['Date']==s2)|(dfa['Date']==s3),1,0)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/11 13:01

    条件式だから | じゃなくて or の方が良いのでは?

    キャンセル

  • 2018/01/11 13:04

    indexが必要ないなら、where使わなくても三項演算子でいいですね。
    1 if dfa['Date'] == s1 or dfa['Date'] == s2 or dfa['Date'] == s3 else 0

    キャンセル

  • 2018/01/11 13:07

    np.whereでの複数条件指定はand/orではなく&/|でないとダメみたいです。

    キャンセル

  • 2018/01/11 13:08

    私の環境では or でも動きました。

    キャンセル

  • 2018/01/11 13:17

    なんと! そうですか。情報ありがとうございます

    キャンセル

  • 2018/01/11 13:21 編集

    例えば print(np.where(True or False, 1, 0)) はどうなるのでしょうか?
    0が出力されるのですか?エラーになるのですか?

    キャンセル

  • 2018/01/11 14:10

    上記コードでは1になりました

    キャンセル

  • 2018/01/11 14:12

    ということは or は使えるということです。他の部分に問題があるのでしょう。

    キャンセル

0

s1 = '2010-2-12'
s2 = '2011-2-11'
s3 = '2012-2-10'

でいいんじゃないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/11 12:50

    あー、Dateは文字列じゃないんですね。失礼しました。

    キャンセル

  • 2018/01/11 12:51

    はい。ありがとうございます。確かにその通りでした。日時と認識していないんじゃないかと試行錯誤している結果が残ってしまっていました

    キャンセル

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

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

関連した質問

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

  • Python 3.x

    4120questions

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

  • Jupyter

    129questions