根据列值合并数据框

时间:2019-02-15 15:12:32

标签: python python-3.x pandas

我有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

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

3 个答案:

答案 0 :(得分:3)

您可以将node设置为两个数据帧的索引,将NaN以外的所有值都设置为-1s,并使用DataFrame.combine_firstNaNs填充到{{1 }},其中df1中的值具有共享索引:

df2

答案 1 :(得分:1)

一种方法是索引\documentclass[a4paper,fleqn]{cas-sc} \begin{document} \section{A} \subsection{AA} \subsubsection{BB} \end{document} 出现的位置,然后继续并将所有数据从-1合并到df1中。然后替换您的df2值(这里我实际上是用新值替换非-1值)。您需要将索引设置为节点才能工作:

-1

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

答案 2 :(得分:0)

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