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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

2回答

193閲覧

PythonのPandasにおいて新規に作成した列に対して既存列の値を条件分岐させ新規列に代入する

Danrussia

総合スコア44

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

0クリップ

投稿2019/07/21 10:23

編集2019/07/21 17:13

前提

下記のDatabase(### 一番最初のDatabase)に新規に列を作成する関数を導入しました。その後新規に導入した
列"C"には
「もしBよりAの方が大きいならば、列CにはAを代入する、そうでない場合は列CにBを代入する 」というコード

列"D"には
「もしAよりBの方が大きいならば、列CにはAを代入する、そうでない場合は列CにBを代入する 」
というコードを関数にして実装したいと思っています。

解決したい事

・「問題のコード」に実装を試みたコードがあるのですが、def文において2回"if"を使う方法(文法的用法)が分かりません。
恐らく調べてくれば、出で来る内容だとは思うのですが、自分の調査能力では見つける事ができなかったので、
もしコードで回答するのが煩わしかったら参考になりそうなサイトのリンクを貼っていただくだけで幸いです。

・これに関しては別段解決しなければいけない問題ではないのですが、
「def Fill_columuns_axis」 「def Fill_columuns_axis」のコードを一本に纏める事って可能ですか?

一番最初のDatabase

Python3

1df1 = pd.DataFrame({'A':['100', '200', '300',"400"], 'B':['110', '150', '300',"380"], 2# A B 3# 100  110 4# 200 150 5# 300 300 6# 400 380 7 8def Make_columuns_axis (Columnuns_axis_df): 9 Columnuns_axis_df['C'] = int() 10 Columnuns_axis_df['D'] = int() 11 return Columnuns_axis_df 12 13Make_columuns_axis(df1) 14# A B C D 15# 100  110 16# 200 150 17# 300 300 18# 400 380

問題のコード

Python3

1#上記のコードで作成した列に値を入れていく 2def Fill_columuns_axis (Fill_axis_df): 3 if Fill_axis_df["A"] >= Fill_axis_df["B"]: 4 Fill_axis_df['C'] = Fill_axis_df["A"] 5 else: Fill_axis_df['C'] = Fill_axis_df["B"] 6return Fill_axis_df 7 8 if Fill_axis_df["A"] <= Fill_axis_df["B"]: 9 Fill_axis_df['D'] = Fill_axis_df["A"] 10 else: Fill_axis_df['D'] = Fill_axis_df["B"] 11return Fill_axis_df

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

File "<ipython-input-16-d2fcc712e7a1>", line 7 if Fill_axis_df["A"] <= Fill_axis_df["B"]: ^ IndentationError: unexpected indent

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

Anaconda
Python
Pycharm
お忙しいとは思いますが、よろしくお願いいたします。
情報に不足がありましたら、ご指摘お願いいたします。

追記

Python3

1df1 = pd.DataFrame({'A':['100', '200', '300',"400"], 'B':['110', '150', '300',"380"]}) 2 3#新たに新規のdfを作成して行の長さをdf1と同一にしている 4df2 = pd.DataFrame({ 'C' : range(len(df1))}) 5 6#"iterrows"関数を使用してdf1の行に対して処理を行おうとしている。 7#for文の"idx"と"val"は"index"と"value"を指す固有名詞? この仕様に関しては見つけられなかった。 8 9for idx, val in df1.iterrows(): 10 11#"print(idx)"でdf1のインデックスを表示 12 13 print(idx) 14 if val.A > val.B: 15 16#"df2.loc[idx,c]"でdf2の列Cを指定 17 18 df2.loc[idx,['C']] = val.A 19 elif val.A < val.B: 20 df2.loc[idx,['C']] = val.B 21 else: 22 df2.loc[idx,['C']] = val.B 23df = pd.concat([df1, df2], axis=1) 24df

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

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

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

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

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

guest

回答2

0

ベストアンサー

apply使った方が簡単だと
https://note.nkmk.me/python-pandas-map-applymap-apply/

python

1import pandas as pd 2 3df = pd.DataFrame({'A':['100', '200', '300',"400"], 'B':['110', '150', '300',"380"]}) 4 5def dfmax(x): 6 if x["A"] > x["B"]: 7 return x["A"] 8 else: 9 return x["B"] 10 11df["C"] = df.apply(lambda x: dfmax(x), axis=1) 12 13def dfmin(x): 14 if x["A"] > x["B"]: 15 return x["B"] 16 else: 17 return x["A"] 18 19df["D"] = df.apply(lambda x: dfmin(x), axis=1) 20 21df

やりたいことだけだとmaxとminを使えばできます

python

1df["C"] = df.apply(lambda x: max(x), axis=1) 2df["D"] = df.apply(lambda x: min(x), axis=1)

投稿2019/07/22 13:06

barobaro

総合スコア1286

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

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

Danrussia

2019/07/23 13:53

シンプルなコードで読みやすかったです。ありがとうございます。
guest

0

あくまで一例ですが、下記のプログラムの拡張で実現できるのではないでしょうか(汚いプログラムですみません汗)。

python

1import pandas as pd 2 3df1 = pd.DataFrame({'A':['100', '200', '300',"400"], 'B':['110', '150', '300',"380"]}) 4df2 = pd.DataFrame({ 'C' : range(len(df1))}) 5#df2 = pd.DataFrame({ 'C' : range(len(df1)),'D' : range(len(df1))}) 6for idx, val in df1.iterrows(): 7 print(idx) 8 if val.A > val.B: 9 df2.loc[idx,['C']] = val.A 10 elif val.A < val.B: 11 df2.loc[idx,['C']] = val.B 12 else: 13 df2.loc[idx,['C']] = val.B 14df = pd.concat([df1, df2], axis=1) 15df

結果)

A B C

0 100 110 110
1 200 150 200
2 300 300 300
3 400 380 400

投稿2019/07/21 11:04

bamboo-nova

総合スコア1408

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

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

Danrussia

2019/07/21 17:17 編集

なんか凄いお洒落なコードだ(語彙力) 今まで殆ど、for文に2つ引数を渡したり「iterrows」を使った事がないので、補足に自分なりにこのコードの解釈を補足で書き足すので(合っているのかどうか)、時間等あれば見ていただけませんか? 2019/07/22 2:15 追記 ちょっとしたトラブルで本文中にコードの質問を投稿するのが遅くなりました。時間がある時で全然かまわないので見て頂ければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問