通过非纳米值之前和之后的大熊猫填充nans

Chr*_*ris 23 python pandas

我想补df的nan平均相邻元件.

考虑一个数据帧:

df = pd.DataFrame({'val': [1,np.nan, 4, 5, np.nan, 10, 1,2,5, np.nan, np.nan, 9]})
    val
0   1.0
1   NaN
2   4.0
3   5.0
4   NaN
5   10.0
6   1.0
7   2.0
8   5.0
9   NaN
10  NaN
11  9.0
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

    val
0   1.0
1   2.5
2   4.0
3   5.0
4   7.5
5   10.0
6   1.0
7   2.0
8   5.0
9   7.0 <<< deadend
10  7.0 <<< deadend
11  9.0
Run Code Online (Sandbox Code Playgroud)

我已经研究了其他解决方案,例如含有NaN的填充单元格,其前后均值,但是在连续两次或更多次np.nan的情况下这不起作用.

任何帮助是极大的赞赏!

San*_*apa 35

使用ffill+ bfill并除以2:

df = (df.ffill()+df.bfill())/2

print(df)
     val
0    1.0
1    2.5
2    4.0
3    5.0
4    7.5
5   10.0
6    1.0
7    2.0
8    5.0
9    7.0
10   7.0
11   9.0
Run Code Online (Sandbox Code Playgroud)

编辑:如果第一个和最后一个元素包含NaN然后使用(Dark 建议):

df = pd.DataFrame({'val':[np.nan,1,np.nan, 4, 5, np.nan, 
                          10, 1,2,5, np.nan, np.nan, 9,np.nan,]})
df = (df.ffill()+df.bfill())/2
df = df.bfill().ffill()

print(df)
     val
0    1.0
1    1.0
2    2.5
3    4.0
4    5.0
5    7.5
6   10.0
7    1.0
8    2.0
9    5.0
10   7.0
11   7.0
12   9.0
13   9.0
Run Code Online (Sandbox Code Playgroud)

  • 如果第一个和最后一个元素是"nan".然后在使用上述解决方案后使用`df.bfill().ffill()`. (7认同)
  • 那真是太棒了.万分感谢 :) (4认同)

mat*_*hme 6

尽管在连续出现多个 的情况下,nan它不会产生您指定的确切输出,但到达此页面的其他用户实际上可能更喜欢该方法的效果interpolate():

df = df.interpolate()

print(df)
     val
0    1.0
1    2.5
2    4.0
3    5.0
4    7.5
5   10.0
6    1.0
7    2.0
8    5.0
9    6.3
10   7.7
11   9.0
Run Code Online (Sandbox Code Playgroud)