我有2个大数据帧,低于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
我尝试使用基本pandas与左连接合并来合并2个数据帧,这会给我一个带有重复列的df,然后循环遍历生成的df中的每一行以检查st1和st2的值,并仅在以下情况下替换它们它不是-1。但是这需要花费大量时间在较大的数据帧中,这就是为什么我想找到最有效的方法来实现这一点
解决办法:
可以设置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 st2
node
a 8.0 -1.0
b 4.0 6.0
c 3.0 4.0








暂无数据