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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

468閲覧

(python)(pandas)新規列として数式を組み込む際のerrorメッセージの避け方

tanak.aaaaa

総合スコア6

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/08/18 01:01

編集2021/08/18 02:38

下記のようなdfに新しい行を追加したいと思っています。
やりたいことはresultという名前のwinという列の値をtotalという列の値で割り、新規列のwin%に収納するという作業です。
また0が多くあるのでzerodivisionerrorにならないようtotal==0の時は0と記入する方法を取りたいと思っています。

しかし私が書いた下記のコードだと
The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
が出てしまいます。
もはや何が原因でエラーに引っかかっているのか分かりません。

result["win%"]= [0 if (result["total"]==0) else (result["win"]/result["total"])]

npで対応できないかと思い下記のコードも試してみたのですがこちらはzerodivisionerrorが出てしまいました。

result["win%"] = np.where(result["total"]==0, 0, result["win"]/result["total"])

どうかエラーに引っかからず新しい列を追加できる方法をお教えいただけますでしょうか?

下記が新しい列を追加したいdf、"result"です
![イメージ説明

回答のほうでresult["win%"] = result["win"]/result["total"]と記入すれば出来ると仰ってくださった方がいらっしゃりそちらの方のコードを試させていただいたところ、その方の書いてくださいましたdfをしようしたコードでは確かにzerodivisionerrorが出なかったのですが、わたくしのコードで試したところやはりエラーが出てしまうようでした。
イメージ説明

先ほどwhereを使う方法をお教えいただいたので早速試させていただいたのですがやはりzero...が出てしまいます。タイプをintやfloatに変更もしてみたのですがやはり機能しませんでした。もしかすると根本的に別の問題がある場合はありますでしょうか?
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

pandasのwhereを使う方法です

pandasのwhereを使う場合は、偽の場合しか変更できないので以下のようにします。

python

1>>> print(df) 2 name total win win% 30 A 101 56 0 41 B 0 0 0 52 C 106 50 0 63 D 0 0 0 74 E 103 58 0 85 F 209 108 0 9>>> df['win%'] = 0 10>>> df['win%'] = df['win%'].where(df['total'] == 0, df['win'] * 100 // df['total']) 11>>> print(df) 12 name total win win% 130 A 101 56 55 141 B 0 0 0 152 C 106 50 47 163 D 0 0 0 174 E 103 58 56 185 F 209 108 51

whereの使い方はpandasで条件に応じて値を代入(where, mask)を読んでください。

投稿2021/08/18 02:11

ppaul

総合スコア24670

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

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

tanak.aaaaa

2021/08/18 02:42

回答ありがとうございます。 素晴らしい方法をお教えいただいたのに大変申し訳ありません、なぜかいまだに問題が解決せずzero...が出てしまいます。 根本的間違いがあるのかとも疑っているのですが、何か思い当たることがあればお教えいただけると大変助かります。
guest

0

特に0かを判定せずにそのまま計算することができ、0除算結果はNaNになります。
あとはNaNを0に置き換えればよいかと思います。

Python

1import pandas as pd 2 3result = pd.DataFrame({'total':[0,101], 'win':[0,56]}) 4 5result['win%'] = result['win'] / result['total'] 6result['win%'].fillna(0, inplace=True) 7 8print(result) 9# total win win% 10#0 0 0 0.000000 11#1 101 56 0.554455

投稿2021/08/18 01:40

can110

総合スコア38341

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

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

tanak.aaaaa

2021/08/18 02:44

回答ありがとうございます。 書いてくださいましたコードを回すとエラーが発生しないのになぜか自分のコードで試すとzero...が出てしまいます。 タイプも一緒に合わせているのでその辺の問題ではなかろうと思うのですが。 何か間違えに気づかれましたらお教えいただければと思います
can110

2021/08/18 02:50

「result['total'] = result['total'].astype(int64)」のように 型変換した結果を代入しないと元の列データは変わりません。
kirara0048

2021/08/18 08:29

シリーズを(数値の入った)オブジェクトdtypeにして実行するとエラーが再現できたので、データ型の問題で正解のようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問