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

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

新規登録して質問してみよう
ただいま回答率
85.35%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

3回答

758閲覧

python 条件分岐がうまくいかない

Shin_go

総合スコア19

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/10/17 10:06

Pythonの条件分岐ifで下記のコードを書いて実行したのですが、
すべて4が返されてしまいます。
変数meal_idには、51種類の数値が割り振られているので、
それを5つに分類したいと思っています。

Python

1# meal_idを5つに分類  2 3def meal_cluster(x): 4 if x["meal_id"] == "1558"or"2581"or"2707": 5 res = 1 6 if x["meal_id"] == "1778"or"1962"or"1993": 7 res = 2 8 if x["meal_id"] == "1109"or"2290"or"2664": 9 res = 3 10 if x["meal_id"] == "1885"or"2539": 11 res = 4 12 else: 13 res = 5 14 return res 15 16meal["meal_cluster"] = meal.apply(meal_cluster, axis=1) 17meal.head()

下記の画像のとおり、なぜか、4が付けられてしまいます。
何かコードが間違えているのでしょうか。
教えていただけますでしょうか。

イメージ説明

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

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

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

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

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

ppaul

2021/10/17 10:15 編集

全部1になるはずです。 4になるのは変ですね。 いや、4であってますね。
guest

回答3

0

条件がいっぱいあるとメンドーですよね。
例えばこんな感じにしたらどうでしょうか?

python

1def meal_cluster(x): 2 meals = { 3 "1558":1, "2581":1, "2707":1, 4 "1778":2, "1962":2, "1993":2, 5 "1109":3, "2290":3, "2664":3, 6 "1885":4, "2539":4} 7 if x["meal_id"] in meals: 8 res = meals[x["meal_id"]] 9 else: 10 res = 5 11 return res

投稿2021/10/17 11:47

takasima20

総合スコア7464

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

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

Shin_go

2021/10/17 12:50

丁寧にありがとうございます、大変ありがたいです。 ただ、すべて5になってしまいました。 DFに問題があるのかもしれません。
Shin_go

2021/10/17 13:01

ダブルクォーテーションを外したら、意図通りに実行されました。本当にありがとうございました。
guest

0

ベストアンサー

ifの使い方と条件式が良くないです。

Python

1# meal_idを5つに分類  2 3def meal_cluster(x): 4 if x["meal_id"] == "1558" or x["meal_id"] == "2581" or x["meal_id"] == "2707": 5 res = 1 6 elif x["meal_id"] == "1778" or x["meal_id"] == "1962" or x["meal_id"] == "1993": 7 res = 2 8 elif x["meal_id"] == "1109" or x["meal_id"] == "2290" or x["meal_id"] == "2664": 9 res = 3 10 elif x["meal_id"] == "1885" or x["meal_id"] == "2539": 11 res = 4 12 else: 13 res = 5 14 return res 15 16meal["meal_cluster"] = meal.apply(meal_cluster, axis=1) 17meal.head()

条件式を修正した場合でも、elifを使用しないとresが4と5のみになってしまいます。
ifの使い方と条件式の書き方を学びましょう。

Pythonのif文による条件分岐の書き方


【追記】
手元で試した結果を追記します。こちらでは問題なさそうです。

Python

1import pandas as pd 2 3meal = pd.DataFrame({'meal_id':['1558','1778','1109','1885','1000','2581','1962','2290','2539','2707','1993','2664']}) 4print(meal) 5# meal_id 6#0 1558 7#1 1778 8#2 1109 9#3 1885 10#4 1000 11#5 2581 12#6 1962 13#7 2290 14#8 2539 15#9 2707 16#10 1993 17#11 2664 18 19def meal_cluster(x): 20 if x["meal_id"] == "1558" or x["meal_id"] == "2581" or x["meal_id"] == "2707": 21 res = 1 22 elif x["meal_id"] == "1778" or x["meal_id"] == "1962" or x["meal_id"] == "1993": 23 res = 2 24 elif x["meal_id"] == "1109" or x["meal_id"] == "2290" or x["meal_id"] == "2664": 25 res = 3 26 elif x["meal_id"] == "1885" or x["meal_id"] == "2539": 27 res = 4 28 else: 29 res = 5 30 return res 31 32meal["meal_cluster"] = meal.apply(meal_cluster, axis=1) 33print(meal) 34# meal_id meal_cluster 35#0 1558 1 36#1 1778 2 37#2 1109 3 38#3 1885 4 39#4 1000 5 40#5 2581 1 41#6 1962 2 42#7 2290 3 43#8 2539 4 44#9 2707 1 45#10 1993 2 46#11 2664 3

投稿2021/10/17 10:30

編集2021/10/17 11:03
meg_

総合スコア10760

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

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

Shin_go

2021/10/17 10:35

丁寧に回答いただきありがとうございます。 大変ありがたいです。 ただ、今後は、すべて5になってしまいました。 elseまでの条件が、すべてfalseになってしまったということですよね。 難しいですね。。
Shin_go

2021/10/17 12:49

何度もありがとうございます。 やはりすべて5になってしまいました。 DFに問題があるのかもしれませんね。
Shin_go

2021/10/17 13:02

ダブルクォーテーションを外したら、意図通りに実行されました。本当にありがとうございました。
guest

0

python

1 if x["meal_id"] == "1885"or"2539": 2 res = 4

これは

python

1 if (x["meal_id"] == "1885") or "2539": 2 res = 4

と同じですので、Falseではない"2539"は常に成り立ち、ブール値としてはTrueと同じ扱いになるからです。

公式ドキュメント 6.11. ブール演算 (boolean operation)をお読みください。

投稿2021/10/17 10:16

編集2021/10/17 10:23
ppaul

総合スコア24670

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

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

Shin_go

2021/10/17 10:18

1、2,3,4,5に分類したいのですが、 例えば、1558の場合は、1になるはずなのに、4になってしまいますので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問