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

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

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

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

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

358閲覧

IF分にて条件分岐を行いたい

sarupip

総合スコア13

Python 3.x

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2018/03/14 10:49

二つのデータが入っているリストがあります。
これの標準偏差が0のものはパスをし、それ以外のリストについて処理を行うことを
行おうとしています。

x_std = x.std()
y_std = y.std()
if (x_std == 0) | (y_std == 0):
pass
else:
len_y = len(y)
if len_lmy <= 10:
・・・後続の処理を行う

そうすると、以下のエラーがでました。

Traceback (most recent call last):
File "C:/Users/d0067587/PycharmProjects/PAL/PRICE_ANALYSIS.py", line 63, in <module>
if (lm_x_std == 0) | (lm_y_std == 0):
File "C:\Users\d0067587\PycharmProjects\new_project\venv2\lib\site-packages\pandas\core\generic.py", line 1121, in nonzero
.format(self.class.name))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

IF文の表記
if (x_std == 0) | (y_std == 0):
は間違っていないと思うのですが、何が原因でエラーが起きているかわかりますでしょうか。
よろしくお願いします。
python3.6.0
pycharm community 2017.03
を使用しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

他の言語ならともかく、Pythonの文法に則っていないからです。 Pythonでは普通はorを使います。
if (x_std == 0) or (y_std == 0): が正しいですね。


pandasには詳しくないのでスマートな書き方がわかりませんが...

Python

1import sys 2float_epsilon = sys.float_info.epsilon 3 4x_std = x.std()[0] 5y_std = y.std()[0] 6 7if any(abs(std) < float_epsilon for std in (x_std, y_std)): 8 pass

改めて考えると、『標準偏差が0』って、『データが全部同値』ってことですよね?
先にそっちの条件でふるい落とした方が正確な気がします。

投稿2018/03/14 10:51

編集2018/03/14 11:05
LouiS0616

総合スコア35658

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

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

LouiS0616

2018/03/14 11:28 編集

あれ、しかし | でも動作しそうな気がしてきた... ん?これひょっとしてstdが数値じゃない感じですかね?
sarupip

2018/03/14 10:58

if (x_std == 0) or (y_std == 0): でもエラーになります。他のHP等では|でも動作するよう記載がありました。 stdは・・・今見ると値は0.0と表示されました。。。
sarupip

2018/03/14 11:28

すばやい回答ありがとうございました。 確かに、データが全部同値なので、そこで落とせばよかったですね・・・。 というわけで、ベストアンサーにさせていただきます。 ありがとうございました。
LouiS0616

2018/03/14 11:30

最初は早とちりして頓珍漢なことを言ってしまいましたが、 結果的に解決のお手伝いが出来たようで何よりです。
guest

0

python

1print(len(lm_x_std)) 2print(len(lm_y_std))

して見てください。

次元が1個多い気がします…

投稿2018/03/14 10:58

mkgrei

総合スコア8560

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

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

sarupip

2018/03/14 11:00

両方とも結果は1でした・・・。
mkgrei

2018/03/14 11:02

ですので、 if (lm_x_std[0] == 0) | (lm_y_std[0] == 0) である必要があります。 ただの数字ならlenでエラーが出るので。
mkgrei

2018/03/14 11:05

LouiS0616さんの回答のように、 x_std = x.std()[0] とするか、 x_std = x.values.std() とすればよいかと思います。
sarupip

2018/03/14 11:27

すばやい回答ありがとうございました。 無事にできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問