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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

pandas

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

973閲覧

Pythonのmerge関数を使う際にデータフレームの内容によって処理を条件分岐させる。

Danrussia

総合スコア44

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

pandas

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/05/25 10:59

編集2019/05/26 08:58

前提・実現したいこと

Pythonのmerge関数を使ってデータの結合を行っています。下記に実際に実装した際のコードを書きました。

df1とdf2が同じ場合(NaN値が発生しない場合)には"how=left"でdf1とdf2が違う場合(NaN値が発生しない場合)には"how=outer"で結合を行いたいです。
(NaN値がある場合か否か<データフレームによって>で結合方法を変えたい)

試したこと

数値条件などの簡易なもののIF文はまだ実装できるのですが、関数,DataFrame等が絡むものはどの様に実装
すれば良いのかが見当がつかなかったので、試した事らしい試した事はないです。すいません。

### ① df1とdf2でデータセットが同じ場合

python3

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

python3

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

python3

1df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='left').drop('PictureNumber', axis=1) 2 Label SumpleNumber BeenNumber 3# img061c.jpg くるみ豆 B2 4# img061c.jpg くるみ豆 B2 5# img061c.jpg くるみ豆 B2 6# .... .... .... 7# img062c.jpg 金持ち豆 B3 8# img062c.jpg 金持ち豆 B3 9# img062c.jpg 金持ち豆 B3 10# .... .... .... 11# img063c.jpg 秘伝豆  B4 12# img063c.jpg 秘伝豆  B4 13# img063c.jpg 秘伝豆  B4

 ② df1とdf2でデータセットで違う場合

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

1df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='outer') 2 Label PictureNumber SumpleNumber BeenNumber 3# img061c.jpg img061c.jpg くるみ豆 B2 4# img061c.jpg img061c.jpg くるみ豆 B2 5# img061c.jpg img061c.jpg くるみ豆 B2 6# .... .... .... .... 7# img062c.jpg img062c.jpg 金持ち豆 B3 8# img062c.jpg img062c.jpg 金持ち豆 B3 9# img062c.jpg img062c.jpg 金持ち豆 B3 10# .... .... .... .... 11# img063c.jpg img063c.jpg 秘伝豆  B4 12# img063c.jpg img063c.jpg 秘伝豆  B4 13# img063c.jpg img063c.jpg 秘伝豆  B4 14# .... .... .... .... 15# img064c.jpg  NaN NaN B7 16# .... .... .... .... 17# NaN img067c.jpg きさらぎ B8

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちょっと目的が把握できませんが、実際にleft joinしてみてNaNがあればouter joinした結果を返す関数を作ってはいかがでしょうか?

Python

1import pandas as pd 2import numpy as np 3 4def func(df1,df2): 5 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='left').drop('PictureNumber', axis=1) 6 if df3['SumpleNumber'].isnull().any(): 7 df3 = pd.merge(df1, df2, left_on='Label', right_on='PictureNumber', how='outer') 8 return df3 9 10df1 = pd.DataFrame({'Label':['img061c.jpg', 'img062c.jpg','img063c.jpg']}) 11df2 = pd.DataFrame({'PictureNumber':['img061c.jpg', 'img062c.jpg', 'img063c.jpg'], 'SumpleNumber':['くるみ豆', '金持ち豆', '秘伝豆'], 'BeenNumber':['B2', 'B3', 'B4']}) 12df3 = func(df1, df2) 13print(df3) 14""" 15 Label SumpleNumber BeenNumber 160 img061c.jpg くるみ豆 B2 171 img062c.jpg 金持ち豆 B3 182 img063c.jpg 秘伝豆 B4 19""" 20 21df1 = pd.DataFrame({'Label':['img061c.jpg', 'img062c.jpg','img063c.jpg','img064c.jpg']}) 22df2 = pd.DataFrame({'PictureNumber':['img061c.jpg', 'img062c.jpg', 'img063c.jpg',"img067c.jpg"], 'SumpleNumber':['くるみ豆', '金持ち豆', '秘伝豆',"きさらぎ"], 'BeenNumber':['B2', 'B3', 'B4',"B8"]}) 23df3 = func(df1, df2) 24print(df3) 25""" 26 Label PictureNumber SumpleNumber BeenNumber 270 img061c.jpg img061c.jpg くるみ豆 B2 281 img062c.jpg img062c.jpg 金持ち豆 B3 292 img063c.jpg img063c.jpg 秘伝豆 B4 303 img064c.jpg NaN NaN NaN 314 NaN img067c.jpg きさらぎ B8 32"""

投稿2019/05/25 22:46

can110

総合スコア38266

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

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

Danrussia

2019/05/26 08:42

意図した通りに動きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問