python - 替换 pandas 数据框中的 nan

标签 python pandas dataframe

给定数据帧 df

df = pd.DataFrame(data=[[np.nan,1],
                  [np.nan,np.nan],
                  [1,2],
                  [2,3],
                  [np.nan,np.nan],
                  [np.nan,np.nan],
                  [3,4],
                  [4,5],
                  [np.nan,np.nan],
                  [np.nan,np.nan]],columns=['A','B'])


df
Out[16]: 
     A    B
0  NaN  1.0
1  NaN  NaN
2  1.0  2.0
3  2.0  3.0
4  NaN  NaN
5  NaN  NaN
6  3.0  4.0
7  4.0  5.0
8  NaN  NaN
9  NaN  NaN

我需要使用以下规则替换 nan:

1) 如果 nan 在开头,则替换为 nan 之后的第一个值

2) 如果 nan 位于 2 个或更多值的中间,则将 nan 替换为这些值的平均值

3) 如果nan在最后替换为最后一个值

df
Out[16]: 
     A    B
0  1.0  1.0
1  1.0  1.5
2  1.0  2.0
3  2.0  3.0
4  2.5  3.5
5  2.5  3.5
6  3.0  4.0
7  4.0  5.0
8  4.0  5.0
9  4.0  5.0

最佳答案

使用add在正向填充值和回填值之间,然后除以 2 并 last 替换最后一个和第一个 NaNs:

df = df.bfill().add(df.ffill()).div(2).ffill().bfill()
print (df)
     A    B
0  1.0  1.0
1  1.0  1.5
2  1.0  2.0
3  2.0  3.0
4  2.5  3.5
5  2.5  3.5
6  3.0  4.0
7  4.0  5.0
8  4.0  5.0
9  4.0  5.0

详细信息:

print (df.bfill().add(df.ffill()))

     A     B
0  NaN   2.0
1  NaN   3.0
2  2.0   4.0
3  4.0   6.0
4  5.0   7.0
5  5.0   7.0
6  6.0   8.0
7  8.0  10.0
8  NaN   NaN
9  NaN   NaN

关于python - 替换 pandas 数据框中的 nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989679/

相关文章:

python - 根据另一列的日期和标志过滤掉行

python - 从 python 更新浏览器中的 d3

python - ldapsearch 可以工作,但 python-ldap 不行

python - 使用 Selenium Python 客户端在不同浏览器中处理 headless (headless)模式

python - 删除行直到达到度量点并提取最小值

python - 在Python数据框中划分几列,其中分子和分母列将根据选择列表而变化

python - 在 sklearn 的 Pipeline 中使用 LabelEncoder 给出 : fit_transform takes 2 positional arguments but 3 were given

pandas - 从 pandas 值序列创建 pandas 区间序列

python - 从url读取csv并通过pandas将其推送到数据库中

r - 如何从整体中提取数据框的一部分?