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

标签 python pandas apply

我有一个数据帧 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_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

我正在执行如下循环,但我想使用 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/

相关文章:

java - 精确匹配同一字符的 N 次重复

python - 使用 Python 求 DataFrame 中总和的平均值

r - 如何将矩阵列作为参数传递给 .apply 函数?

python - 将PeriodicCallback添加到已经运行的IOLoop实例

java - Python 编程 - 在 Python 中开发企业级软件的规则/建议?

python - 尝试在 Python : delete item in map and "vector.erase(vector.end())" 中重写 C++ 代码时出现问题

python - 如何将任意字典存储到文件中,以便也可以在 Fortran 中读取它?

Python:将从每一行中提取数据的字典

R:apply 与 do.call

python - 根据其他列中的值平均某些列