将带有条件的两个DataFrame合并到更新列或追加行

时间:2017-08-31 21:50:22

标签: python-3.x pandas

我有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个系列时,我无法返回与合并等匹配的特定行。

1 个答案:

答案 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

<强>变体
减少lambdamerge

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