我有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
编辑:我尝试了几种方法,包括:使用key作为索引连接,在键上进行合并,对列进行显式调用,然后向左合并以附加不匹配的值。我面临的问题是合并要么合并所有列,要么创建完全重复的df,或者当我显式调用列时,它不允许匹配pandas系列aganst数据帧。当我在列调用上规范化使用2个系列时,我无法返回与合并等匹配的特定行。
答案 0 :(得分: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