检查两个数据帧之间的公共行并将第二个数据帧的匹配行替换为 df1 的值

Posted

技术标签:

【中文标题】检查两个数据帧之间的公共行并将第二个数据帧的匹配行替换为 df1 的值【英文标题】:Check common rows between two dataframes and replace the matched rows of second dataframe, with the values of df1 【发布时间】:2019-08-15 03:45:22 【问题描述】:

我有两个数据框,比如说 df1 和 df2。两个数据框都具有名为 URL 和 Age 的相同列。我想检查df2 ['URL']中的df1 ['URL'],然后用df1 ['Age']替换匹配行的df2 ['Age'],并将其余行保留在df2中而不做任何更改。

df1

URL          Category                         Age     
google.com  [IAB19, Technology & Computing]   A
youtube.com [IAB25, Non-Standard Content]     H
facebook.co [IAB14, Society]                  A
amazon.com  [IAB22, Shopping]                 M
wpedia.org  [IAB5, Education]                 E

df2

URL          Category         Age     
google.com  [IAB19, BBCA]     T
youtube.com [IAB25, AACB]     T
facebook.co [IAB14, HLGB      T 
amazon.com  [IAB22, ETCL]     T
wpedia.org  [IAB5, J TCL]     T
example1.com [LHTB, 2213]     A
example2.com [OPCL, 9909]     A
example3.com [PPRS, 7656]     A

现在,我想检查 df2['URL'] 中是否存在 df1['URL'] 中的任何 URL,我想用 df1['Age'] 替换 df2['Age'] 并保持不常见URLS 没有任何变化。

因此,预期的输出将是:

df3

URL          Category         Age     
google.com  [IAB19, BBCA]     A
youtube.com [IAB25, AACB]     H
facebook.co [IAB14, HLGB      A
amazon.com  [IAB22, ETCL]     M
wpedia.org  [IAB5, J TCL]     E
example1.com [LHTB, 2213]     A
example2.com [OPCL, 9909]     A
example3.com [PPRS, 7656]     A

【问题讨论】:

【参考方案1】:

map + fillna:

map 允许我们替换常见 URL 的年龄,然后 .fillna 恢复不匹配的 URL 的值。这假设URLdf1 中的唯一键:

df3 = df2.copy()
df3['Age'] = df3.URL.map(df1.set_index('URL').Age).fillna(df3.Age)

#            URL            Category Age
#0    google.com  [IAB19, BBCA]        A
#1   youtube.com  [IAB25, AACB]        H
#2   facebook.co  [IAB14, HLGB         A
#3    amazon.com  [IAB22, ETCL]        M
#4    wpedia.org  [IAB5, J TCL]        E
#5  example1.com   [LHTB, 2213]        A
#6  example2.com   [OPCL, 9909]        A
#7  example3.com   [PPRS, 7656]        A

【讨论】:

以上是关于检查两个数据帧之间的公共行并将第二个数据帧的匹配行替换为 df1 的值的主要内容,如果未能解决你的问题,请参考以下文章

根据第二个数据帧的匹配列更新熊猫数据帧

如何为第一个数据帧中匹配的特定列值的所有值获取第二个数据帧的数据?

R:基于多个条件的两个数据帧的子集

R:从一个数据帧中提取行,基于列名匹配来自另一个数据帧的值

根据来自不同数据帧的行名将列从另一个数据帧复制到

来自两个数据帧的总数据按行名匹配