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_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
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)
您可以使用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)