我有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时。但这在较大的数据帧中会花费很多时间,这就是为什么我想找到最有效的方法来实现这一点。
答案 0 :(得分:3)
您可以将node
设置为两个数据帧的索引,将NaN
以外的所有值都设置为-1s
,并使用DataFrame.combine_first
将NaNs
填充到{{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