error解決メモ ValueError: The truth value of a Series is ambiguous.


はじめに

 pandasのdataframeを扱う中である条件に従って場合分けした値が代入された新たな列を追加したい時に出てきたValueError: The truth value of a Series is ambiguousについて解決方法を残しておきたいと思います。

事象

 今回行おうとしたことはF,M,XNAの3つの値で表された性別データがあり、そのデータに0,1,2で置き換えた列を追加する作業です。
 いろいろなやり方があると思いますが今回は関数を作り、それを使いデータを作ろうとしたところエラーが出ました。その時の疑似データと書いたコードは以下の通りです。

data
import pandas as pd

df= pd.DataFrame(['M','F','M','XMA','F','F'], columns=['GENDER'])
df
-----------
GENDER
0   M
1   F
2   M
3   XMA
4   F
5   F
code
def gender_number(gender):
    if gender == 'M':
        return 0
    elif gender == 'F':
        return 1
    else:
        return 2

df['GENDER_INT'] = gender_number(df['GENDER'])
-----------
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

seriesの値があいまいだと言われています。多分ですが各要素一つ一つ返すのか全体で関数を適用するのかわからないのだと考えられます。(間違っていたらごめんなさい)

解決方法

 seriesの各要素ごとに関数を適用するにはmap関数を使えばできるようです。
そのコードが下記になります。

map
df['GENDER_INT'] = df['GENDER'].map(gender_number)
df
-----------
    GENDER  GENDER_INT
0   M   0
1   F   1
2   M   0
3   XMA 2
4   F   1
5   F   1

うまくいきました。ご参考になれば幸いです。

追記(他の方法で列を追加してみた)

 apply関数の場合

apply
df['GENDER_INT'] = df['GENDER'].apply(gender_number)

lambda関数を使った場合

lambda
df['GENDER_INT'] = df['GENDER'].apply(lambda x: 0 if x=='F' else 1 if x=='M' else 2)