基于列值合并数据框

我有 2 个大数据框,下面 2 个只是这两个数据框的示例。


df1 = pd.DataFrame(columns=['node', 'st1', 'st2'], data=[['a', 1, -1], ['b', 2, 2], ['c', 3, 4]])


node  st1  st2 

 a    1   -1

 b    2    2

 c    3    4


df2 = pd.DataFrame(columns=['node', 'st1', 'st2'], data=[['a', 8, 5], ['b', 4, 6]])


node  st1  st2

 a    8    5

 b    4    6

仅当两个数据帧中的节点名称匹配时,我才想用 df2、st1 和 st2 列值更新 df1、st1 和 st2 列值。此外,如果 df1 中的 st1 或 st2 列值等于 -1,则不要更新该行和列,即保持为 -1。结果看起来像,


node  st1  st2

 a     8   -1

 b     4    6

 c     3    4

我已经尝试使用基本的熊猫合并与左连接合并 2 个数据帧,这会给我一个重复列的 df,然后循环遍历结果 df 中的每一行以检查 st1 和 st2 的值,并仅在以下情况下替换它们它不是-1。但这会在较大的数据帧中花费大量时间,这就是为什么我想找到最有效的方法来做到这一点。


慕虎7371278
浏览 183回答 3
3回答

www说

您可以设置node为索引在两个dataframes,设置为NaN除所有值-1s和使用DataFrame.combine_first,以填补NaNs在df1与值df2与共享索引:df = df1.set_index('node')df.where(df.eq(-1)).combine_first(df2.set_index('node')).fillna(df)      st1  st2node          a     8.0 -1.0b     4.0  6.0c     3.0  4.0

一只萌萌小番薯

一种方法是对-1出现的位置进行索引,然后继续将所有数据合并到df1from 中df2。然后替换您的-1值(这里我实际上是用-1新值替换非值)。您需要将索引设置为节点才能工作:df1 = df1.set_index('node')df2 = df2.set_index('node')no_repl = df1 == -1new_df = df2.combine_first(df1)new_df = df1.where(no_repl, new_df).reset_index()与@yatu 的帖子的想法相同。只是语法略有不同。

哆啦的时光机

df3 = df1.set_index('node')df4 = df2.set_index('node')keep_loc = (df3 == -1) | ~df3.index.isin(df4.index)[:, np.newaxis]df3.where(keep_loc, df4)      st1  st2node          a       8   -1b       4    6c       3    4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python