🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

2回答

806閲覧

変数の定義がquery()内に通っていない理由を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/01/14 10:55

以下のコードを実行すると、三行目のaveの部分でエラー
UndefinedVariableError: name 'ave' is not defined
が出てしまいます。
一行目でaveを定義しているつもりなのですが、何が原因なのでしょうか。

python

1ave=df_receipt[~df_receipt["customer_id"].str.startswith("Z")].groupby("customer_id").amount.sum().mean() 2df_tmp=df_receipt[~df_receipt["customer_id"].str.startswith("Z")].groupby("customer_id").agg({"amount":"sum"}) 3df_tmp.query("amount=>ave")

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

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

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

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

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

guest

回答2

0

元のデータフレームが分かりませんので確実なことはいえませんが、df_tmpには"ave"という列がないために起こっているエラーのようです。

ave=df_receipt[~df_receipt["customer_id"].str.startswith("Z")].groupby("customer_id").amount.sum().mean()
は新しいデータフレームを作っただけで、df_receiptには"ave"という列は追加されていません。その結果df_tmpにも"ave"という列がないことが問題なのではないでしょうか。

ave=df_receipt[~df_receipt["customer_id"].str.startswith("Z")].groupby("customer_id").amount.sum().mean()

df_receipt["ave"]=df_receipt[~df_receipt["customer_id"].str.startswith("Z")].groupby("customer_id").amount.sum().mean()

に変えるとどうなりますか?

投稿2021/01/14 11:20

ppaul

総合スコア24670

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

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

退会済みユーザー

退会済みユーザー

2021/01/14 12:49

回答ありがとうございます。 確かにdf_tmpにaveの列はありません。 ここでaveはdf_receiptから得られる一つの値で、ppaul様にご提案いただいたコードを実行すると同じ値がSeriesとして出力されましたが、エラー内容自体は同じでした。 上の操作は以下リンクのgoogle colab内で動作します。 https://github.com/noguhiro2002/100knocks-preprocess_ForColab-AzureNotebook/blob/master/preprocess_knock_Python_Colab.ipynb
guest

0

ベストアンサー

3行目のaveの前に@を挿入することで、aveのエラーは解消します。

query に渡す式表現では論理表現 以外を含めないほうがよい。条件によって式表現を変えたい、なんて場合は 式表現を都度 文字列として連結 + 生成するか、ローカル変数に計算結果を入れて式表現に渡す。

ローカル変数を式表現中に含める際は、変数名を @ ではじめる。

python

1ave=df_receipt[~df_receipt["customer_id"].str.startswith("Z")].groupby("customer_id").amount.sum().mean() 2df_tmp=df_receipt[~df_receipt["customer_id"].str.startswith("Z")].groupby("customer_id").agg({"amount":"sum"}) 3df_tmp.query("amount=>@ave")

ちなみに、この3行だけ実行しますと、NameError: name 'df_receipt' is not defined が発生します。

投稿2021/01/14 11:10

編集2021/01/14 11:12
_whitecat_22

総合スコア1305

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

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

退会済みユーザー

退会済みユーザー

2021/01/14 12:58

回答ありがとうございます。 @をつけることで無事動作しました。 query内の決まりとしてあるのですね。 >>ちなみに、この3行だけ実行しますと、NameError: name 'df_receipt' is not defined が発生します。 →大変申し訳ありません。以下リンクのgoogle colab内でのみ動作できることを失念していました。 https://github.com/noguhiro2002/100knocks-preprocess_ForColab-AzureNotebook/blob/master/preprocess_knock_Python_Colab.ipynb
_whitecat_22

2021/01/14 13:00

解決して良かったです!!^^ お役に立てて嬉しく思います。 こちらも勉強になりました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/01/14 13:19

すみません、質問をクローズした後で申し訳ないのですが、 >>条件によって式表現を変えたい、なんて場合は 式表現を都度 文字列として連結 + 生成するか の部分が理解できていません。 もしよろしければ参考となるコード等紹介していただけないでしょうか? よろしくお願いいたします。
_whitecat_22

2021/01/15 01:58

>式表現を都度 文字列として連結 + 生成するか、ローカル変数に計算結果を入れて式表現に渡す。 ↓ >①式表現を都度 文字列として連結 + 生成して、式表現に渡す。 >②ローカル変数に計算結果を入れて式表現に渡す。 ①については、式(条件式)をそのまま利用するのではなく、 『一時的に、条件式を " " または ' ' で囲い、それら同士を`+`で連結して、新たに文字列として生成し』て、その上でこの生成した文字列を『式表現に渡す』と解釈しています。 なお、回答の際に参照した元ページは、こちらです。 ※元ページには、上述の『』内の解説はなく、飽くまでも私個人の解釈です。  具体的なコードをご紹介できずに申し訳ございません。 ↓ Python pandas 図でみる データ連結 / 結合処理 http://sinhrks.hatenablog.com/category/pandas?page=1422976978
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問