我有一个数据帧 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
如果有值,我想添加一个与 value_j
对应的列 w
。如果 value_j
是 NaN
我想将 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
我正在执行如下循环,但我想使用 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]
最佳答案
你可以使用 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()]
关于Python:如何用数据框中的条件替换 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52219988/