pandas 使用合并覆盖 Dataframe 行

pqwbnv8z  于 2022-12-10  发布在  其他
关注(0)|答案(3)|浏览(265)

我正在尝试用第二个 Dataframe 的行和列覆盖一个 Dataframe 中的特定行和列。我不能给予实际数据,但我将在这里使用代理。
下面是一个例子和我所尝试的:

df1
    UID   B     C     D     
0   X14   cat   red   One
1   X26   cat   blue  Two
2   X99   cat   pink  One
3   X54   cat   pink  One

df2
   UID    B     C      EX2
0   X14   dog   blue   coat
1   X88   rat   green  jacket
2   X99   bat   red    glasses
3   X29   bat   red    shoes

我在这里要做的是用df2中基于UID的值覆盖df1中的BC列。因此,在本例中,df2中的X88X29不会出现在df2中。此外,D列不会受到影响,EX2也不会受到影响
结果会是这样的:

df1
    UID   B     C     D     
0   X14   dog   blue  One
1   X26   cat   blue  Two
2   X99   bat   red   One
3   X54   cat   pink  One

我看着这个方案:Pandas merge two dataframe and overwrite rows然而,这似乎只更新空值,而我想要覆盖。
我的尝试看起来像这样:

df = df1.merge(df2.filter(['B', 'C']), on=['B', 'C'], how='left')

对于我的数据,这实际上似乎没有覆盖任何东西。请有人解释为什么这不会工作吗?
谢谢

bz4sfanl

bz4sfanl1#

一种方法如下:

  • 首先,使用df.set_index使列UID成为索引(inplace)。
  • 接下来,使用df.update,并将参数overwrite设置为True(对于“其他”df,此处也使用set_indexdf2)。这将基于索引匹配(即现在的UID)覆盖两个DFS共有的所有列(即BC)。
  • 最后,使用df.reset_index还原标准索引。
df1.set_index('UID', inplace=True)
df1.update(df2.set_index('UID'), overwrite=True)
df1.reset_index(inplace=True)
print(df1)

   UID    B     C    D
0  X14  dog  blue  One
1  X26  cat  blue  Two
2  X99  bat   red  One
3  X54  cat  pink  One
a1o7rhls

a1o7rhls2#

您可以使用reindex_likecombine_first来解决这个问题。
试试这个:

out = (
        df2.set_index("UID")
           .reindex_like(df1.set_index("UID"))
           .combine_first(df1.set_index("UID"))
           .reset_index()
       )
#输出:
print(out)

   UID    B     C    D
0  X14  dog  blue  One
1  X26  cat  blue  Two
2  X99  bat   red  One
3  X54  cat  pink  One
wz3gfoph

wz3gfoph3#

使用更新功能

df1.set_index('UID', inplace=True)
df2.set_index('UID', inplace=True)

df1.update(df2)
df1.reset_index(inplace=True)
print(df1)
输出
UID    B     C    D
0  X14  dog  blue  One
1  X26  cat  blue  Two
2  X99  bat   red  One
3  X54  cat  pink  One

相关问题