我有一个数据df1
框,它对应nodes
于网络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
我想添加一个w
对应于的列(value_j
如果存在该值)。如果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()]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句