また,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
ただ、複数の値を持っているオブジェクトの真理値は一意に定められない(ということにしておいた方が無難)なので、このbool
のSeries
を直接「真理値」としては扱えない仕様になっています。
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
に対して処理するというのがしたいことという可能性もあり得ます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。