はじめに
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)