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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3579閲覧

The truth value of a Series is ambiguous???

Pablito

総合スコア71

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/20 07:16

前提・実現したいこと

あるアンケートに基づいたデータで
回答が1~7の数字になっています。

その数字に応じて年齢層を当てはめていきたいのですが、
以下のエラーが起きました。

発生している問題・エラーメッセージ

ValueError Traceback (most recent call last) <ipython-input-17-cd51ad4d6f63> in <module> ----> 1 data['age'] = data.apply(lambda row: age(row), axis=1) c:\users\jupyter-notebook\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, result_type, args, **kwds) 6904 kwds=kwds, 6905 ) -> 6906 return op.get_result() 6907 6908 def applymap(self, func): c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in get_result(self) 184 return self.apply_raw() 185 --> 186 return self.apply_standard() 187 188 def apply_empty_result(self): c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in apply_standard(self) 290 291 # compute the result using the series generator --> 292 self.apply_series_generator() 293 294 # wrap results c:\users\jupyter-notebook\lib\site-packages\pandas\core\apply.py in apply_series_generator(self) 319 try: 320 for i, v in enumerate(series_gen): --> 321 results[i] = self.f(v) 322 keys.append(v.name) 323 except Exception as e: <ipython-input-17-cd51ad4d6f63> in <lambda>(row) ----> 1 data['age'] = data.apply(lambda row: age(row), axis=1) <ipython-input-16-5f52c4822bc4> in age(row) 1 def age(row): ----> 2 if (data['a2'] == 0): 3 return'19歳以下' 4 elif (data['a2'] == 1): 5 return'20~24歳' c:\users\jupyter-notebook\lib\site-packages\pandas\core\generic.py in __nonzero__(self) 1554 "The truth value of a {0} is ambiguous. " 1555 "Use a.empty, a.bool(), a.item(), a.any() or a.all().".format( -> 1556 self.__class__.__name__ 1557 ) 1558 ) ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')

該当のソースコード

Python

1def age(row): 2 if (data['a2'] == 0): 3 return'19歳以下' 4 elif (data['a2'] == 1): 5 return'20~24歳' 6 elif (data['a2'] == 2): 7 return '25~29歳' 8 elif (data['a2'] == 3): 9 return '30~34歳' 10 elif (data['a2'] == 4): 11 return '35~39歳' 12 elif (data['a2'] == 5): 13 return '40~44歳' 14 elif (data['a2'] == 6): 15 return '45~49歳' 16 else: 17 return '50歳以上' 18data['age'] = data.apply(lambda row: age(row), axis=1)

試したこと

条件を()で囲んだら解決するかと思いましたが、
失敗しました。
|とかを使うのか、もしくはfor文の方がよいかなど
色々考えていますが、頂ければ幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

if (data['a2'] == 0):だと複数行に対して0かを判定しているため提示エラーが発生しています。
当該行のa2列値の判定をすればよいのでif (row['a2'] == 0):のように書き換えるとよいです。

投稿2019/08/20 07:25

can110

総合スコア38234

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

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

Pablito

2019/08/20 07:33

ご回答ありがとうございます。 なんとなくifの書き方が分かってきたような気がします。 お力添え感謝致します。
guest

0

まず、関数を定義しているので、「lambda」はいらないと思います。

data.apply(age, axis=1)ですと、dataの各行のデータについて関数を適用することになります。

データフレームの内容が不明ですが、やりたいことはおそらく年齢の列データを作成したいのかと思います。

こんな感じでしょうか。

python

1 2def age(row): 3 if (row == 0): 4 return'19歳以下' 5 elif (row == 1): 6 return'20~24歳' 7 elif (row == 2): 8 return '25~29歳' 9 elif (row == 3): 10 return '30~34歳' 11 elif (row == 4): 12 return '35~39歳' 13 elif (row == 5): 14 return '40~44歳' 15 elif (row == 6): 16 return '45~49歳' 17 else: 18 return '50歳以上' 19 20data['age'] = data.['a2']apply(age, axis=1) 21

投稿2019/08/20 07:38

meg_

総合スコア10577

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問