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

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

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

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

pandas

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

Q&A

2回答

662閲覧

【Pandas】データフレームを結合する際に重複があったら更新したい

niwatorinancha

総合スコア3

Python

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

pandas

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

0グッド

2クリップ

投稿2021/04/12 07:05

前提・実現したいこと

2つのデータフレームを結合する際に、同様のデータがある場合には片方のデータに更新したい

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

old_df
A 1 100
A 2 120
A 3 140
B 1 150
B 2 80
B 3 60

new_df
A 2 130
A 3 140
A 4 140
B 2 100
B 3 65
A 4 10

これらを結合する際にnew_dfにデータがある行はそちらのデータに更新したいです

A 1 100
A 2 130
A 3 140
A 4 140
B 1 150
B 2 100
B 3 65
B 4 10

試したこと

concatで結合してから前のデータを消していたのですが、一発で更新できる方法があるのでは?と思い質問させていただきました

ご存じの方よろしくお願いします

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

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

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

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

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

guest

回答2

0

インデックスを適切に設定すれば、.combine_first()メソッドを利用できます。
pandas.DataFrame.combine_first — pandas documentation

python

1In [11]: old_df 2Out[11]: 3 0 1 2 40 A 1 100 51 A 2 120 62 A 3 140 73 B 1 150 84 B 2 80 95 B 3 60 10 11In [12]: new_df 12Out[12]: 13 0 1 2 140 A 2 130 151 A 3 140 162 A 4 140 173 B 2 100 184 B 3 65 195 B 4 10

このとき、

python

1In [13]: new_df.set_index([0, 1]).combine_first(old_df.set_index([0, 1])).reset_index() 2Out[13]: 3 0 1 2 40 A 1 100.0 51 A 2 130.0 62 A 3 140.0 73 A 4 140.0 84 B 1 150.0 95 B 2 100.0 106 B 3 65.0 117 B 4 10.0

投稿2021/04/14 02:33

kirara0048

総合スコア1399

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

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

0

きれいな方法を思いつかなかったので、とりあえずの実現方法です。
columnsは0,1,2としてやっています。

python

1print(old_df) 2print(new_df) 3temp_df = pd.merge(old_df, new_df, on=(0,1), how='outer') 4temp_df[2] = temp_df.apply(lambda row:int(row['2_x']) if pd.isna(row['2_y']) else int(row['2_y']), axis=1) 5merge_df = temp_df.drop(columns = ['2_x', '2_y']).sort_values([0,1]) 6print(merge_df)

実行結果

python

1>>> print(old_df) 2 0 1 2 30 A 1 100 41 A 2 120 52 A 3 140 63 B 1 150 74 B 2 80 85 B 3 60 9>>> print(new_df) 10 0 1 2 110 A 2 130 121 A 3 140 132 A 4 140 143 B 2 100 154 B 3 65 165 B 4 10 17>>> temp_df = pd.merge(old_df, new_df, on=(0,1), how='outer') 18>>> temp_df[2] = temp_df.apply(lambda row:int(row['2_x']) if pd.isna(row['2_y']) else int(row['2_y']), axis=1) 19>>> merge_df = temp_df.drop(columns = ['2_x', '2_y']).sort_values([0,1]) 20>>> print(merge_df) 21 0 1 2 220 A 1 100 231 A 2 130 242 A 3 140 256 A 4 140 263 B 1 150 274 B 2 100 285 B 3 65 297 B 4 10

投稿2021/04/12 09:19

ppaul

総合スコア24666

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問