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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

Q&A

解決済

4回答

1870閲覧

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

jun.k

総合スコア28

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

0グッド

0クリップ

投稿2018/01/11 01:44

編集2018/01/11 03:16

データフレーム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

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

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

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

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

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

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

fuzzball

2018/01/11 02:28

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

2018/01/11 03:18

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

2018/01/11 03:29

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

回答4

0

機能しない原因は

Python

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

の結果を

Python

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

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

とりあえずは

Python

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

の部分を

Python

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

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

投稿2018/01/11 03:30

magichan

総合スコア15898

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

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

jun.k

2018/01/11 03:43

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

0

Python

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

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

投稿2018/01/11 03:43

編集2018/01/11 03:47
mkgrei

総合スコア8560

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

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

jun.k

2018/01/11 03:53

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

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 03:57

jun.k

総合スコア28

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

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

fuzzball

2018/01/11 04:01

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

2018/01/11 04:04

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

2018/01/11 04:07

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

2018/01/11 04:08

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

2018/01/11 04:17

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

2018/01/11 04:21 編集

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

2018/01/11 05:10

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

2018/01/11 05:12

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

0

python

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

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

投稿2018/01/11 03:47

fuzzball

総合スコア16731

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

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

fuzzball

2018/01/11 03:50

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

2018/01/11 03:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問