2017-08-31 8 views
3

2つのデータフレームに同じ列があります。これらのデータフレームをキー列にマージ(または結合)したいのですが、キーの一致がある場合は一致する行の1つの列を更新し、そうでなければ最初の/古いデータフレームを追加します。条件付きの2つのデータフレームを列の更新または行の追加にマージする

例Psudeocode:

for row in new_dataset: 
if new_dataset['key'] == old_dataset['key']: 
    old_dataset['last_seen'] = new_dataset['last_seen'] 
else: 
    append row to old_dataset 

例入力:

DF1

Key  First_Seen Last_Seen Data Data 
Bigfoot 2015  2015  Blah Blah 
Loch_Ness 2016  2016  Blah Blah 
UFO  2016  2004  Blah Blah 

DF2

Key  First_Seen Last_Seen Data Data 
UFO  2017  2017  Blah Blah 
Tupac  2017  2017  Blah Blah 

所望の出力:

DF3

Key  First_Seen Last_Seen Data Data 
Bigfoot 2015  2015  Blah Blah 
Loch_Ness 2016  2016  Blah Blah 
UFO  2016  2017  Blah Blah 
Tupac  2017  2017  Blah Blah 

編集:非を追加するために、左マージその後、右の列を明示的に呼び出すと、キーにマージをやって、インデックスとしてキーに参加し、私は含まれるように、いくつかのアプローチを試みました一致した値。私が直面している問題は、マージがすべての列を結合したい、または完全に複製されたdfを作成するか、明示的に列を呼び出すときに、データフレームに合わせてパンダシリーズに一致させることができないことです。私は、列の呼び出しで2シリーズを使用して正規化するとき、私は上のマージするマッチした特定の行をバック返す方法がない、など

+0

は 'pd.concat'は、'適切first_seenとlast_seen列を更新しないと、スタックオーバーフロー、@itotallyforgotに – Wen

+0

をdrop_duplicate'。あなたがすでに試したこと、そしてそれがうまくいかなかったことを知るための答えをあなたに提供しようとする人にとっては役に立ちそうです。 – itotallyforgot

+0

ようこそ、データの損失が発生します – Degan

答えて

2

新しい回答
少ない

df1.append(df2).pipe(
    lambda d: (
     lambda f: f('Key').assign(
      Last_Seen=f('Key', 'last').Last_Seen.values) 
    )(d.drop_duplicates) 
).reset_index(drop=True) 

     Key First_Seen Last_Seen Data Data.1 
0 Bigfoot  2015  2015 Blah Blah 
1 Loch_Ness  2016  2016 Blah Blah 
2  UFO  2016  2017 Blah Blah 
3  Tupac  2017  2017 Blah Blah 

バリアントlambdaよりmerge

df1.merge(df2, 'outer', 'Key', suffixes=['', '_']).pipe(
    lambda d: d.fillna(
     d.filter(regex='_$').rename(columns=lambda x: x[:-1]) 
    ).assign(Last_Seen=d.Last_Seen_.fillna(d.Last_Seen)) 
)[df1.columns].astype(df1.dtypes) 

     Key First_Seen Last_Seen Data Data.1 
0 Bigfoot  2015  2015 Blah Blah 
1 Loch_Ness  2016  2016 Blah Blah 
2  UFO  2016  2017 Blah Blah 
3  Tupac  2017  2017 Blah Blah 

旧回答

d1, d2 = df1.set_index('Key').align(df2.set_index('Key')) 
d3 = d1.combine_first(d2) 
d3.update(d2.Last_Seen) 
d3 = d3.reset_index().astype(df1.dtypes) 
d3 

     Key First_Seen Last_Seen Data Data.1 
0 Bigfoot  2015  2015 Blah Blah 
1 Loch_Ness  2016  2016 Blah Blah 
2  Tupac  2017  2017 Blah Blah 
3  UFO  2016  2017 Blah Blah 
+0

それだけです。理想的には、第3のデータフレームを作成したくないのは理想的です。最初の2つのデータフレームはすでにかなり大きなものになっていますが、それを数回試してみました。ありがとうございました! combine_firstも使用しようとしたときに、私はそれを混乱させました。 – itotallyforgot

+0

興味があれば、私は別の答えを提供しました。 – piRSquared

+0

大規模なデータセットで比較テストを行い、その実行方法を教えてください – itotallyforgot

関連する問題