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

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

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

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

pandas

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

Q&A

解決済

2回答

2592閲覧

iterrows()メソッドを使って、Null値で条件分岐処理したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

pandas

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

0グッド

0クリップ

投稿2021/05/04 16:46

編集2021/05/04 16:50

Null値の入ったデータに対してiterrows()を使って行ごとに条件分岐を行い、rateの列に、
Null値が無い時は計算を、
Null値がある時は0を代入したいです。

ですがそもそも”rate”列を挿入できず、分岐もうまく行っていないようです。
どなたかどの点に問題があるかご教授いただけますと幸いです。

python

1import pandas as pd 2#DataFrameを生成するコード 3df = pd.DataFrame([[400, 300], [500, 200], [None, 3],[300,None]], columns=['unit_price', 'unit_cost']) 4 5for i, r in df.iterrows(): 6 if not pd.isnull(r["unit_cost"]): #Null値がない時には利益率を計算 7 r["rate"]=(df['unit_price'] - df['unit_cost']) / df['unit_price'] 8 9 else:#Null値がある時は0を入力 10 r["rate"]=0 11#Null箇所確認 12df[df["unit_cost"].isnull()]

出力結果

python

1 2   unit_price unit_cost 33 300.0    NaN 4

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

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

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

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

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

guest

回答2

0

iterrowsを使っても出来ますが、計算して後で補正する方が楽でしょう。

iterrows()を使う方法

python

1>>> for i, r in df.iterrows(): 2... if not (pd.isnull(r["unit_price"]) or (pd.isnull(r["unit_cost"]))): 3... df.loc[i, "rate"] = (r['unit_price'] - r['unit_cost']) / r['unit_price'] 4... else: 5... df.loc[i, "rate"] = 0 6... 7>>> print(df) 8 unit_price unit_cost rate 90 400.0 300.0 0.25 101 500.0 200.0 0.60 112 NaN 3.0 0.00 123 300.0 NaN 0.00

計算して後で補正する方法

python

1>>> df = pd.DataFrame([[400, 300], [500, 200], [None, 3],[300,None]], columns=['unit_price', 'unit_cost']) 2>>> 3>>> df["rate"] = ((df['unit_price'] - df['unit_cost']) / df['unit_price']).fillna(0) 4>>> print(df) 5 unit_price unit_cost rate 60 400.0 300.0 0.25 71 500.0 200.0 0.60 82 NaN 3.0 0.00 93 300.0 NaN 0.00

投稿2021/05/04 22:39

ppaul

総合スコア24666

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

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

退会済みユーザー

退会済みユーザー

2021/05/05 12:50

教えていただいた方法で解決できました。 確かに後で補正する方が楽ですね。 別解まで教えてくださり大変感謝します。
hide5stm

2021/05/05 12:56

そうです。dataframeは、なるべくループせずに別解のようにする方が処理速度やメモリ使用量などを考えても良いはずです。
guest

0

ベストアンサー

rはループ内の変数なので、r["rate"]に代入しても dfには反映されないです。
なので、左辺をdf.loc[]で指定、右辺の計算は行ごとにやれるので以下のように書けばいいと思います

python

1 if not pd.isnull(r["unit_cost"]): 2 df.loc[i, "rate"] = (r['unit_price'] - r['unit_cost']) / r['unit_price'] 3 else: 4 df.loc[i, "rate"] = 0

投稿2021/05/04 17:07

hide5stm

総合スコア426

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

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

退会済みユーザー

退会済みユーザー

2021/05/05 12:53

迅速な回答ありがとうございました。 教えていただいた方法で解決できました。 ループ内の変数はdfには反映され無いのですね。。。 言われてみれば確かに納得です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問