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

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

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

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

Q&A

1回答

376閲覧

データフレーム 内の数字の比較の仕方。

shunsuke1937

総合スコア48

Python 3.x

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

0グッド

0クリップ

投稿2019/07/10 12:27

やりたいこと

データフレーム の内の文字を比較して、Trueなら1,Falseなら0
を得るようなコードを書きたい。
例えば以下のようなコードを書き実行させましたが、Value errorが返ってきております。
以下のように真理値を正しく比較するコードの書き方をご教示いただけますでしょうか?
また,dframe['A']==dframe['D']
については、結果としてTrueという結果が返ってくることは確認済みです。

よろしくお願いいたします。

python

1import pandas as pd 2data={'A':[1],'B':[2],'C':[3],'D':[1],'E':[2]} 3dframe=pd.DataFrame(data,index=['a']) 4dframe 5# A B C D E 6#a 1 2 3 1 2 7 8listLI=[] 9if dframe['A']==dframe['D']: 10 listLI.append(1) 11# error message 12#ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 13

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

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

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

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

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

guest

回答1

0

また,dframe['A']==dframe['D']

については、結果としてTrueという結果が返ってくることは確認済みです。

それはTrueという結果ではありません。

python

1import pandas as pd 2 3data={'A':[1],'B':[2],'C':[3],'D':[1],'E':[2]} 4dframe=pd.DataFrame(data,index=['a']) 5 6x = dframe['A'] == dframe['D'] 7print("type", type(x)) 8print("print") 9print(x) 10 11""" => 12type <class 'pandas.core.series.Series'> 13print 14a True 15dtype: bool 16"""

Trueという単一の値のみを要素に持つSeriesが返っています。

解説

Series同士の比較では、同じ形のbool型の要素を持つSeriesが返ります。ま、これは何かと便利に使えます。

python

1>>> import pandas as pd 2>>> pd.Series([1,2,3]) == pd.Series([1,0,3]) 30 True 41 False 52 True 6dtype: bool 7

ただ、複数の値を持っているオブジェクトの真理値は一意に定められない(ということにしておいた方が無難)なので、このboolSeriesを直接「真理値」としては扱えない仕様になっています。

python

1>>> bool(pd.Series([1,2,3]) == pd.Series([1,0,3])) 2# 中略 3ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
対処

とりあえずanyやallなどの論理演算が行えますので、それで一つにまとめることは可能です。

python

1>>> (pd.Series([1,2,3]) == pd.Series([1,0,3])).all() 2False 3>>> (pd.Series([1,2,3]) == pd.Series([1,0,3])).any() 4True

が、今回のデータのように「行を1つしか持たせない」のであれば、最初からSeriesとしてデータを定義した方がスマートに思います。

python

1import pandas as pd 2 3data = {'A':1, 'B':2, 'C':3, 'D':1, 'E':2} 4s = pd.Series(data) 5listLI=[] 6if s['A'] == s['D']: # ここではSeriesの各要素が取り出される 7 listLI.append(1) 8print(listLI) # => [1]

もちろん、質問ではこう書いたけど実データでは複数あるんだということもあると思います。その場合は目的を考えて選択してください。あるいは、一行ずつループで取り出して各行のSeriesに対して処理するというのがしたいことという可能性もあり得ます。

投稿2019/07/10 14:38

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問