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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

1回答

576閲覧

IF文のTRUEで何もしないという結果を出したい

XxhanakoXx

総合スコア3

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

0クリップ

投稿2023/03/07 10:05

編集2023/03/10 10:08

実現したいこと

カラム名1にAAAと言うデータが入っていた場合、データの更新等をしない設定にしたい。

前提

参照元のデータはPosgreSQLにあり、
そこからデータを抽出して必要な加工をPythonで施しSQLサーバに移すと言う作業を定期実行する為のPythonコード内容の一部です。

データフレーム2に入っているデータが0より大きかった場合、tryifのコードを実行する。
データフレーム4に入っているデータが0より大きかった場合、elifのコードを実行する。

Pandasデータフレーム0にはSQLサーバからデータを引っ張ってきて必要なデータに編集したデータが入っています。
Pandasデータフレーム1にはデータフレーム0から抽出した最新データのみを入れています。
Pandasデータフレーム2には時間を計算した数字が入っています。
Pandasデータフレーム3にはカラム名1が【AAA】だった場合に処理するデータを収納します。
Pandasデータフレーム4にはPandasデータフレーム2とは違う時間を計算した数字が入っています。
Pandasデータフレーム5にはデータフレーム4の値が0より大きかった場合に処理するデータを収納します。

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

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

該当のソースコード

一番最初に作成したコード try: if Pandasデータフレーム2 >= 0: Pandasデータフレーム3=Pandasデータフレーム1.copy() Pandasデータフレーム3.loc[:,'カラム名4']=datetime.datetime.now() Pandasデータフレーム3.loc[:,'カラム名3']='' Pandasデータフレーム3.loc[:,'カラム名2']='' Pandasデータフレーム3.loc[:,'カラム名1']='AAA' Pandasデータフレーム3 Pandasデータフレーム0=Pandasデータフレーム0.append(Pandasデータフレーム3, ignore_index = True) elif Pandasデータフレーム4 >= 0: Pandasデータフレーム5=Pandasデータフレーム1.copy() Pandasデータフレーム5.loc[:,'カラム名5']=1 Pandasデータフレーム0.update(Pandasデータフレーム5) except Exception: pass このコードだとエラーは発生せず欲しい結果のデータがPandasデータフレーム3、Pandasデータフレーム5に収納され、 Pandasデータフレーム0のデータも更新されますが、このコードを実行するたびに同じデータが増幅してしまう事に気づき、 PosgreSQLのデータとSQLサーバのデータを結合し結合したファイルで条件分岐を行う事を思いつき下記コードを作成。 2番目に作成したコード try: if Pandasデータフレーム1["カラム名1"] != "AAA": if Pandasデータフレーム2 >= 0: Pandasデータフレーム3=Pandasデータフレーム1.copy() Pandasデータフレーム3.loc[:,'カラム名4']=datetime.datetime.now() Pandasデータフレーム3.loc[:,'カラム名3']='' Pandasデータフレーム3.loc[:,'カラム名2']='' Pandasデータフレーム3.loc[:,'カラム名1']='AAA' Pandasデータフレーム3 Pandasデータフレーム0=Pandasデータフレーム0.append(Pandasデータフレーム3, ignore_index = True) elif Pandasデータフレーム4 >= 0: Pandasデータフレーム5=Pandasデータフレーム1.copy() Pandasデータフレーム5.loc[:,'カラム名5']=1 Pandasデータフレーム0.update(Pandasデータフレーム5) except Exception: pass しかし、このコードだと最初の部分でエラーが出るという事がこちらのサイトに質問投稿してわかりました。

試したこと

その後、どんなエラーが出ているのか調べる為、エラーが出てたらそのエラー内容をプリントするというコードを見つけ内容を確認しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2023/03/07 10:47

情報が不足していますが、おそらくDF1とかDF2というのはpandas.DataFrameですよね?であればif文の条件式が意図したものになっていないのだと思います。
melian

2023/03/07 11:33

DF1 が Pandas のデータフレームだとすれば、 if DF1["総合判定"] != "AAA": の部分で、 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). などというエラーが発生するかと思います。 DF1 の総合判定の列に一人でも AAA 判定の人がいたら、という条件式の場合は、以下の様にします。 if DF1['総合判定'].eq('AAA').any():  pass
XxhanakoXx

2023/03/07 14:55

質問の内容や情報不足明確にも関わらず、 解答ありがとうございます。 もう少し質問内容を編集します。 DF1やDF2はPandasデータフレームのことです。 最初の部分ですでにエラー内容案件だったのですね。 それが分かっただけでもありがたいです。 まずはもう少し情報を付け加えてみます。
guest

回答1

0

自己解決

最初に質問内容の情報が少ないという中回答いただけたmeg_さんとmelianさんの情報をもとに自分で調べたところ、
一つの解答へとたどり着きましたので、それを載せます。

このコードだと最初の部分でエラーが出るという事がこちらのサイトに質問投稿してわかりました。
その後、どんなエラーが出ているのか調べる為、エラーが出てたらそのエラー内容をプリントするというコードを見つけ内容を確認しました。
それに該当するエラー内容を調べた結果

if (np.all(Pandasデータフレーム1["カラム名1"] != "AAA")):

こうする事で該当エラーが出ることなく結果が出るようになりました。

まだ回数をこなしていなく、ほかのデータが入ってきたときにどう言う動きをするのかが判らないので完全解決ではありませんが、
tryifが最初から動いていない!という現象からは抜け出せました。

この度は情報が少ない中コメントを下さった方、そしてこういった事が書かれていないと駄目ですよと指摘くださった方。
本当にありがとうございました。
ちょっとした会話で自分の中でもどうしたら良いのか考え1つの答えを導き出せました。
また質問がありましたらよろしくお願い致します。
その時にはもう少し情報をまとめてから質問投稿するように心がけたいと思います。

ありがとうございました!

投稿2023/03/10 00:32

編集2023/03/10 01:08
XxhanakoXx

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問