为了账号安全,请及时绑定邮箱和手机立即绑定

基于列值合并数据框

基于列值合并数据框

慕虎7371278 2021-11-09 20:18:36
我有 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    4df2 = 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。但这会在较大的数据帧中花费大量时间,这就是为什么我想找到最有效的方法来做到这一点。
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

您可以设置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


查看完整回答
反对 回复 2021-11-09
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

一种方法是对-1出现的位置进行索引,然后继续将所有数据合并到df1from 中df2。然后替换您的-1值(这里我实际上是用-1新值替换非值)。您需要将索引设置为节点才能工作:


df1 = df1.set_index('node')

df2 = df2.set_index('node')


no_repl = df1 == -1

new_df = df2.combine_first(df1)

new_df = df1.where(no_repl, new_df).reset_index()

与@yatu 的帖子的想法相同。只是语法略有不同。


查看完整回答
反对 回复 2021-11-09
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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  st2

node          

a       8   -1

b       4    6

c       3    4


查看完整回答
反对 回复 2021-11-09
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信