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

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

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

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

pandas

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

222閲覧

Pythonのpandasにおいて特定のcolumnsがあった場合、それを削除し分岐条件を行う

Danrussia

総合スコア44

Python 3.x

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

pandas

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/06/20 09:50

編集2019/06/20 12:33

前提・実現したい事

Pythonのmerge関数とif文を用いてデータ構造ごとにmergeの処理を変えるプログラムを実装したいと思っています。
デーダフレイム(df2)に"品種名"というコラムがある場合には、この"品種名"というコラムを削除したうえで、指定した結合をする、ない場合はそのまま結合する。というようなコードを実装したいのですが、下記の実装例①はちゃんと実装できたのですが、②の場合で上手く実装できません。

 ① df1とdf2の結合の際にNaN値が発生するが、コラムは全て一致する場合

python3

1df1 = pd.DataFrame({'Label':['img061c.jpg', 'img061c.jpg', 'img061c.jpg',...,'img062c.jpg','img062c.jpg','img062c.jpg',...,'img063c.jpg','img063c.jpg','img063c.jpg',...,'img064c.jpg','img064c.jpg','img064c.jpg']}) 2# Label 3# img061c 4# img061c 5# img061c 6# .... 7# img062c 8# img062c 9# img062c 10# .... 11# img063c 12# img063c 13# img063c 14# .... 15# img064c 16# img064c 17# img064c

python3

1df2 = pd.DataFrame({'PictureNumber':['img061c.jpg', 'img062c.jpg', 'img063c.jpg',"img067c.jpg"], 'SumpleNumber':['くるみ豆', '金持ち豆', '秘伝豆',"きさらぎ"], 'BeenNumber':['B2', 'B3', 'B4',"B8"]}) 2# PictureNumber SumpleNunber BeenNumber 3# img061c くるみ豆 B2 4# img062c 金持ち豆 B3 5# img063c 秘伝豆 B4 6# img067c きさらぎ B8

python3

1def Merging (df1,df2): 2 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='left').drop('PictureNumber', axis=1) 3 if df3['Sumple'].isnull().any(): 4 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='outer') 5 return df3 6 Label PictureNumber SumpleNumber BeenNumber 7# img061c.jpg img061c.jpg くるみ豆 B2 8# img061c.jpg img061c.jpg くるみ豆 B2 9# img061c.jpg img061c.jpg くるみ豆 B2 10# .... .... .... .... 11# img062c.jpg img062c.jpg 金持ち豆 B3 12# img062c.jpg img062c.jpg 金持ち豆 B3 13# img062c.jpg img062c.jpg 金持ち豆 B3 14# .... .... .... .... 15# img063c.jpg img063c.jpg 秘伝豆  B4 16# img063c.jpg img063c.jpg 秘伝豆  B4 17# img063c.jpg img063c.jpg 秘伝豆  B4 18# .... .... .... .... 19# img064c.jpg  NaN NaN B7 20# .... .... .... .... 21# NaN img067c.jpg きさらぎ B8

 ② df1とdf2の結合の際にNaN値が発生し、コラムが一致しない場合

python3

1df1 = pd.DataFrame({'Label':['img061c.jpg', 'img061c.jpg', 'img061c.jpg',...,'img062c.jpg','img062c.jpg','img062c.jpg',...,'img063c.jpg','img063c.jpg','img063c.jpg',...,'img064c.jpg','img064c.jpg','img064c.jpg']}) 2# Label 3# img061c 4# img061c 5# img061c 6# .... 7# img062c 8# img062c 9# img062c 10# .... 11# img063c 12# img063c 13# img063c 14# .... 15# img064c 16# img064c 17# img064c

python3

1df2 = pd.DataFrame({'PictureNumber':['img061c.jpg', 'img062c.jpg', 'img063c.jpg',"img067c.jpg"], 'SumpleNumber':['くるみ豆', '金持ち豆', '秘伝豆',"きさらぎ"], 'BeenNumber':['B2', 'B3', 'B4',"B8"]}) 2# PictureNumber SumpleNunber BeenNumber 品種名 3# img061c くるみ豆 B2 4# img062c 金持ち豆 B3 5# img063c 秘伝豆 B4 6# img067c きさらぎ B8

python3

1def Merging (df1,df2): 2 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='left').drop('PictureNumber', axis=1) 3 if df3['Sumple'].isnull().any()."品種名" in df3.columns: 4 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='outer').drop("品種名",axis=1).drop('PictureNumber', axis=1) 5 elif df3['Sumple'].isnull().any()."品種名" not in df3.columns: 6 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='outer').drop('PictureNumber', axis=1) 7 return df3 8 Label PictureNumber SumpleNumber BeenNumber   9# img061c.jpg img061c.jpg くるみ豆 B2 10# img061c.jpg img061c.jpg くるみ豆 B2 11# img061c.jpg img061c.jpg くるみ豆 B2 12# .... .... .... .... 13# img062c.jpg img062c.jpg 金持ち豆 B3 14# img062c.jpg img062c.jpg 金持ち豆 B3 15# img062c.jpg img062c.jpg 金持ち豆 B3 16# .... .... .... .... 17# img063c.jpg img063c.jpg 秘伝豆  B4 18# img063c.jpg img063c.jpg 秘伝豆  B4 19# img063c.jpg img063c.jpg 秘伝豆  B4 20# .... .... .... .... 21# img064c.jpg  NaN NaN B7 22# .... .... .... .... 23# NaN img067c.jpg きさらぎ B8

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

File "<ipython-input-41-be1b7423ae12>", line 3 if df3['Sumple'].isnull().any()."品種名" in df3.columns: ^ SyntaxError: invalid syntax

実際に書いたコード

Python3

1def Merging (df1,df2): 2 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='left').drop('PictureNumber', axis=1) 3 if df3['Sumple'].isnull().any()."品種名" in df3.columns: 4 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='outer').drop("品種名",axis=1).drop('PictureNumber', axis=1) 5 elif df3['Sumple'].isnull().any()."品種名" not in df3.columns: 6 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='outer').drop('PictureNumber',

参考にしたサイト

http://nekoyukimmm.hatenablog.com/entry/2015/04/10/133917

https://teratail.com/questions/191326

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

仕様を完全に理解できたわけではありませんが・・、

デーダフレイム(df2)に"品種名"というコラムがある場合には、この"品種名"というコラムを削除したうえで、指定した結合をする、ない場合はそのまま結合する。

なのであれば、DataFraem.drop()の引数に error='ignore' を追加して

Python

1df2.drop('品種名', axis=1, errors='ignore')

するだけでよいかと思います。

このパラメータによってエラーが発生ても『何もしない』となりますので、df2に '品種名'の列がある場合は削除を行い、無い場合でも『何もしない』という動作となりますので条件文が不要となります。

結果、merge文の箇所は

df3 = pd.merge(df1, df2.drop('品種名', axis=1, errors='ignore'), left_on='Label', right_on='PictureNumber', how='outer')

のようにすると良いのではないでしょうか。

投稿2019/06/20 23:39

magichan

総合スコア15898

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

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

Danrussia

2019/06/22 08:40

私の期待通りに動いてくれました。ありがとうございます。 次投稿する時は、もう少し問題点(疑問点)を明確にして質問します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問