我正在尝试用第二个 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
中的B
和C
列。因此,在本例中,df2
中的X88
和X29
不会出现在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')
对于我的数据,这实际上似乎没有覆盖任何东西。请有人解释为什么这不会工作吗?
谢谢
3条答案
按热度按时间bz4sfanl1#
一种方法如下:
df.set_index
使列UID
成为索引(inplace
)。df.update
,并将参数overwrite
设置为True
(对于“其他”df,此处也使用set_index
:df2
)。这将基于索引匹配(即现在的UID
)覆盖两个DFS共有的所有列(即B
和C
)。df.reset_index
还原标准索引。a1o7rhls2#
您可以使用
reindex_like
和combine_first
来解决这个问题。试试这个:
#输出:
wz3gfoph3#
使用更新功能
输出