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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

453閲覧

論理演算式で発生するValueErrorの解決方法

shunsuke1937

総合スコア48

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/01/23 02:33

解決したいこと

ValueErrorを解決したい。

論理演算式を用いて以下のようなコード書きました。

python

1import pandas as pd 2 3Li ={'A':[1,2,3,4],'B':[1,2,3,4],'C':[3,2,4,1],'D':[1,2,3,2],'E':[1,4,3,1],'F':[3,1,2,4]} 4df = pd.DataFrame(Li) 5def TP3(Y1,Y2,Y3,R1,R2,R3): 6 if (((Y1==R1)|(Y1==R2)|(Y1==R3))& 7 ((Y2==R1)|(Y2==R2)|(Y2==R3))& 8 ((Y3==R1)|(Y3==R2)|(Y3==R3))): 9 return 1 10 else: 11 return 0 12TP['R']=TP3(df['A'],df['B'],df['C'],df['D'],df['E'],df['F'])

以下のようなエラーが出力されます。
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

トライしたこと

まずはじめに、関数が動作するのかを確認し問題なく動作することを確認し、正しく動作していることを確認しました。

python

1TP3(1,2,3,1,2,3) 2#-->1 3 4TP3(1,2,3,1,4,3) 5#-->0

次に関数を用いずに、動作をするかを確認しました。こちらも正しく動作していることを確認しました。

python

1Y1=df['A'] 2Y2=df['B'] 3Y3=df['C'] 4R1=df['D'] 5R2=df['E'] 6R3=df['F'] 7df['R']=(((Y1==R1)|(Y1==R2)|(Y1==R3))& 8 ((Y2==R1)|(Y2==R2)|(Y2==R3))& 9 ((Y3==R1)|(Y3==R2)|(Y3==R3))) 10 11#0 True 12#1 True 13#2 False 14#3 True 15#Name: R, dtype: bool

教えていただきたいこと。

関数を使った際のValueErrorを回避する方法について教えてください。

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

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

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

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

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

guest

回答3

0

質問のコードの場合、

(((Y1==R1)|(Y1==R2)|(Y1==R3))& ((Y2==R1)|(Y2==R2)|(Y2==R3))& ((Y3==R1)|(Y3==R2)|(Y3==R3)))

の結果は

0 True 1 True 2 False 3 True dtype: bool <class 'pandas.core.series.Series'>

となります。
このSeriesにany()やall()を使ってTrueかFalseを出力すればエラーは解消されるでしょう。

投稿2021/01/23 03:13

meg_

総合スコア10760

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

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

shunsuke1937

2021/01/23 04:56

ご解説いただき、ありがとうございました。 any およびand を使う方法にて解決することができました。
guest

0

ベストアンサー

|をor, &をandに変更すべきですが、それでもエラーは出ます。
原因は、TrueやFalseの並んだSeriesの比較です。
エラーメッセージのいうように、.any()か.all()かの実現したい方を付けましょう。

python

1>>> import pandas as pd 2>>> 3>>> Li ={'A':[1,2,3,4],'B':[1,2,3,4],'C':[3,2,4,1],'D':[1,2,3,2],'E':[1,4,3,1],'F':[3,1,2,4]} 4>>> df = pd.DataFrame(Li) 5>>> def TP3(Y1,Y2,Y3,R1,R2,R3): 6... if (((Y1==R1)or(Y1==R2)or(Y1==R3))and 7... ((Y2==R1)or(Y2==R2)or(Y2==R3))and 8... ((Y3==R1)or(Y3==R2)or(Y3==R3))): 9... return 1 10... else: 11... return 0 12... 13>>> df_AD = df['A'] == df['D'] 14>>> df_AE = df['A'] == df['E'] 15>>> 16>>> print(type(df_AD)) 17<class 'pandas.core.series.Series'> 18>>> print(df_AD) 190 True 201 True 212 True 223 False 23dtype: bool 24>>> print(df_AE) 250 True 261 False 272 True 283 False 29dtype: bool 30>>> print(df_AD or df_AE) 31Traceback (most recent call last): 32 File "<stdin>", line 1, in <module> 33 File "C:\Users\shinp\anaconda3\lib\site-packages\pandas\core\generic.py", line 1478, in __nonzero__ 34 raise ValueError( 35ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 36>>> 37>>> print(df_AD.any() or df_AE.any()) 38True 39>>> print(df_AD.all() or df_AE.all()) 40False

投稿2021/01/23 02:59

ppaul

総合スコア24670

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

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

meg_

2021/01/23 03:21

> |をor, &をandに変更すべきですが そうなんですか?pandasのときは|、&を使っていましたが良くないのでしょうか?
ppaul

2021/01/23 03:53

今回の場合は、orやandがすべて比較演算の結果のTrueかFalseです。 クラスboolがintのサブクラスであり、Trueをintに変換すると1、Falseをintに変換すると0であるということを理解した上で使うと良いのですが、理解していない人がそれをやると、いつか正規表現のマッチングの結果などで&や|を使ったりして、バグを出す可能性が高いので、|や&を使わない習慣を付けておいたほうが良いと思います。
shunsuke1937

2021/01/23 04:52

ご回答いただき、ありがとうございました。 上記のご説明いただきました内容にて解決することができました。
shunsuke1937

2021/01/23 04:53

また、追加解説いただきありがとうございました。
guest

0

|の演算子はビット演算子です
論理演算させるなら、or を使う必要があります

投稿2021/01/23 02:37

y_waiwai

総合スコア88042

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

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

shunsuke1937

2021/01/23 04:54

ご説明いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問