Python:如何用数据帧中的条件替换NaN?

ema*_*max 7 python apply pandas

我有一个数据df1框,对应nodes于网络中的egelist 和value节点本身,如下所示:

df
    node_i    node_j    value_i   value_j
0    3         4          89         33
1    3         2          89         NaN
2    3         5          89         69
3    0         2          45         NaN
4    0         3          45         89
5    1         2          109        NaN
6    1         8          109        NaN
Run Code Online (Sandbox Code Playgroud)

我想添加一个w对应于value_jif是否有值的列.如果value_jNaN我想设置w作为平均的相邻节点的值的i.在node_i仅具有NaN设置值的相邻节点的情况下w=1.

所以最终的数据框应该像愚弄:

df
    node_i    node_j    value_i   value_j      w
0    3         4          89         33       33
1    3         2          89         NaN      51      # average of adjacent nodes
2    3         5          89         69       69
3    0         2          45         NaN      89      # average of adjacent nodes
4    0         3          45         89       89
5    1         2          109        NaN       1      # 1
6    1         8          109        NaN       1      # 1
Run Code Online (Sandbox Code Playgroud)

我正在做如下循环,但我想使用apply:

nodes = pd.unique(df['node_i'])
df['w'] = 0
for i in nodes:
    tmp = df[df['node_i'] == i]
    avg_w = np.mean(tmp['value_j'])
    if np.isnan(avg_w):
          df['w'][idx] = 1
    else:
          tmp.ix[tmp.value_j.isnull(), 'value_j'] = avg_w ## replace NaN with values
          df['w'][idx] = tmp['value_j'][idx]  
Run Code Online (Sandbox Code Playgroud)

cnc*_*gvg 4

您可以使用groupby以下方法来执行此操作:

fill_value = df.groupby("node_i")["value_j"].mean().fillna(1.0)
df["w"] = fill_value.reindex(df["node_i"]).values
df["w"][df["value_j"].notnull()] = df["value_j"][df["value_j"].notnull()]
Run Code Online (Sandbox Code Playgroud)