🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2733閲覧

seriesの bool型のif分岐がうまくいかない

stair_rod

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/21 02:28

##質問内容
pandasのデータフレーム処理で、時間の比較を行いたいのですが、Nanの処理で行き詰まっています。
二つの時刻が入ったtime1とtime2という変数があります。これらの大小を比較し、前者が早い場合はTrue,後者が早い場合はFalse,Nan値についてはNanを返したいのですが、Nanの処理がうまくいきません。そこで、NanもFalseに判定されていることから、大なり小なりの両方を比較し、両方FalseのものをNanにするという方法で行おうとしたのですが、これもまたif分岐が昨日しません。

def judge_early_much(judge1,judge2): if (judge1 is False) and (judge2 is False): print('1') return np.nan else: return judge1 #pd.isnull判定がうまくいかないので、両方falseの方ものをnanにする judge_early = time1 > time2 judge_early_inverse = time1 < time2 df['judge_early'] = judge_early_much(judge_early,judge_early_inverse) y1 = judge_early.value_counts() y2 = judge_early_inverse.value_counts() y3 = df['judge_early'].value_counts() print(y1,y2,y3)

###出力結果

True 83066 False 28160 dtype: int64 False 103247 True 7979 dtype: int64 True 83066 False 28160 Name: judge_early, dtype: int64

time1およびtime2の中身例は双方とも以下のような形です。当然配列の長さはは同じです。
26 06:59:00
27 06:59:00
28 06:59:00
29 06:59:00
...
111196 NaT
111197 NaT
111198 NaT
111199 NaT
<class 'pandas.core.series.Series'>
このように、y1とy3の出力が同じになっており、両方Falseの判定がうまくいっていません。
##試したこと
時刻比較の部分を、関数化し、time1がNaTならnp.nanを返すようにしたりもしましたが、下記エラーが出て判定できませんでした。

def judge_early(start,early): if pd.isnull(start): return np.nan elif pd.isnull(early): return np.nan else: judge = start > early return judge judge = judge_early(time1,time2)

###出力

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-66-b181776ef32c> in <module> 7 judge = start > early 8 return judge ----> 9 judge = judge_early(time1,time2) <ipython-input-66-b181776ef32c> in judge_early(start, early) 1 def judge_early(start,early): ----> 2 if pd.isnull(start): 3 return np.nan 4 elif pd.isnull(early): 5 return np.nan ~/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in __nonzero__(self) 1476 raise ValueError("The truth value of a {0} is ambiguous. " 1477 "Use a.empty, a.bool(), a.item(), a.any() or a.all()." -> 1478 .format(self.__class__.__name__)) 1479 1480 __bool__ = __nonzero__ ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

どうぞよろしくお願いいたします。

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

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

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

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

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

otn

2019/09/21 02:54

単独で実行可能なコードと、期待する出力、実際の出力を書いてください。
stair_rod

2019/09/21 04:32

dataframeから読み込んだデータですので記載しておりませんでした。申し訳ありません。 他の方の回答で解決いたしましたので、ここで終了させていただきます。 ありがとうございました。
guest

回答1

0

ベストアンサー

pandas.isnullNaTも判定できます。
以下、単純コードで利用例を示します。

Python

1import pandas as pd 2import time 3 4def tm(h): 5 return time.strptime(str(h), '%H') 6 7# テストデータ 8sr1 = pd.Series(['1:00:00', pd.np.nan, '3:00:00', '6:00:00']) 9sr2 = pd.Series(['2:00:00', '3:00:00', pd.np.nan, '5:00:00']) 10sr1 = pd.to_datetime(sr1) 11sr2 = pd.to_datetime(sr2) 12df = pd.DataFrame({'s1':sr1,'s2':sr2}) 13print(df) 14""" 15 s1 s2 160 2019-09-21 01:00:00 2019-09-21 02:00:00 171 NaT 2019-09-21 03:00:00 182 2019-09-21 03:00:00 NaT 193 2019-09-21 06:00:00 2019-09-21 05:00:00 20""" 21 22def judge_early(r): 23 if pd.isnull(r['s1']) or pd.isnull(r['s2']): 24 return pd.np.nan 25 return r['s1'] < r['s2'] 26 27sr = df.apply(judge_early, axis=1) 28print(sr) 29""" 300 True 311 NaN 322 NaN 333 False 34dtype: object 35"""

投稿2019/09/21 04:17

can110

総合スコア38341

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

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

stair_rod

2019/09/21 04:31

解決しました。ありがとうございます。 関数の引数を二個以上に設定すると、ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). のエラーが出てきてしまうようですね。
can110

2019/09/21 04:43

judge_early関数のことであれば、引数を増やすのではなく「r['s3']」のように増やした列にアクセスすることで対応できるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問