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

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

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

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

pandas

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

Q&A

解決済

2回答

14189閲覧

pandasを使った2つのDataFrameの比較処理について

s-hara

総合スコア52

Python

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

pandas

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

0グッド

0クリップ

投稿2018/09/26 06:06

【実現したいこと】
2つのDataframeの値を比較し、ある条件に一致する行だけを対象に特定列の値をアップデートしたい。

具体的には以下の様な事を実現したい。

以下の様な2つのデータフレーム「pd_A,pd_B」があるものとする。 --------------------------- データフレーム「pd_A」の内容 ※col1,col2,col3は列名 --------------------------- col1  col2  col3 0 A001 value001 False 1 A001 value002 False 2 A001 value003 False 3 A002 value001 False 4 A002 value002 False 5 A002 value003 False -------------------------- データフレーム「pd_B」の内容 ※col1,col2は列名 -------------------------- col1  col2 0 A001 value001 1 A001 value002 2 A002 value001 3 A002 value003

上記2つのデータフレームpd_A,pd_Bにおいて、pd_Bの各行(col1,col2の組み合わせ)と一致するpd_Aの行(col1,col2の組み合わせ)のcol3の値をFalse→Trueに更新したい。

期待する結果 col1  col2  col3 0 A001 value001 True →pd_Bに存在する行だけcol3の値をFalse→Trueに更新 1 A001 value002 True  →同上 2 A001 value003 False 3 A002 value001 True  →同上 4 A002 value002 False 5 A002 value003 True  →同上

当方、pandas初心者でいろいろ調べてみましたがいまいち実現方法がわからず、有識者のご教授を頂きたいと思います。

宜しくお願い致します。

====================
環境情報
OS:windows
pandas: 0.23.4
====================

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

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

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

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

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

guest

回答2

0

もっと良い方法ありそうだけど・・。
とりあえず思いついた方法を2つほど。

1. DataFrame.update()使う方法

Python

1import pandas as pd 2 3pd_A = pd.DataFrame( 4 [['A001','value001',False], 5 ['A001','value002',False], 6 ['A001','value003',False], 7 ['A002','value001',False], 8 ['A002','value002',False], 9 ['A002','value003',False]], 10 columns=['col1','col2','col3']) 11 12pd_B = pd.DataFrame( 13 [['A001','value001'], 14 ['A001','value002'], 15 ['A002','value001'], 16 ['A002','value003']], 17 columns=['col1','col2']) 18 19pd_A = pd_A.set_index(['col1','col2']) 20pd_B = pd_B.set_index(['col1','col2']) 21pd_A.update(pd_B.assign(col3=True)) 22pd_A = pd_A.reset_index() 23print(pd_A) 24# col1 col2 col3 25#0 A001 value001 True 26#1 A001 value002 True 27#2 A001 value003 False 28#3 A002 value001 True 29#4 A002 value002 False 30#5 A002 value003 True

2. DataFrame.merge()indicatorを使う方法

Python

1import pandas as pd 2 3pd_A = pd.DataFrame( 4 [['A001','value001',False], 5 ['A001','value002',False], 6 ['A001','value003',False], 7 ['A002','value001',False], 8 ['A002','value002',False], 9 ['A002','value003',False]], 10 columns=['col1','col2','col3']) 11 12pd_B = pd.DataFrame( 13 [['A001','value001'], 14 ['A001','value002'], 15 ['A002','value001'], 16 ['A002','value003']], 17 columns=['col1','col2']) 18 19pd_A = pd_A.merge(pd_B, on=['col1','col2'], how='left', indicator=True) 20pd_A['col3'] = pd_A['_merge'] == 'both' 21pd_A = pd_A.drop(columns='_merge') 22print(pd_A) 23# col1 col2 col3 24#0 A001 value001 True 25#1 A001 value002 True 26#2 A001 value003 False 27#3 A002 value001 True 28#4 A002 value002 False 29#5 A002 value003 True

投稿2018/09/26 06:47

編集2018/09/26 06:48
magichan

総合スコア15898

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

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

s-hara

2018/09/26 08:24

ご回答ありがとうございます。 数万レコードあるので、ループよりupdateの方法を使ったほうが高速に処理することができました! ありがとうございました!
guest

0

ベストアンサー

素直にループで。

python

1import io 2import pandas as pd 3 4d1 = """ 5 col1 col2 col3 60 A001 value001 False 71 A001 value002 False 82 A001 value003 False 93 A002 value001 False 104 A002 value002 False 115 A002 value003 False 12""" 13 14d2 = """ 15 col1 col2 160 A001 value001 171 A001 value002 182 A002 value001 193 A002 value003 20""" 21 22df_a = pd.read_table(io.StringIO(d1), sep="\s+", engine="python") 23df_b = pd.read_table(io.StringIO(d2), sep="\s+", engine="python") 24 25c = [] 26for i, row_a in df_a[["col1", "col2"]].iterrows(): 27 for j, row_b in df_b.iterrows(): 28 if (row_a == row_b).all(): 29 c.append(True) 30 break 31 else: 32 c.append(False) 33df_a["col3"] = c 34print(df_a) 35""" => 36 col1 col2 col3 370 A001 value001 True 381 A001 value002 True 392 A001 value003 False 403 A002 value001 True 414 A002 value002 False 425 A002 value003 True 43""" 44

投稿2018/09/26 06:35

hayataka2049

総合スコア30933

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

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

s-hara

2018/09/26 08:23

ご回答ありがとうございます! 参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問