【问题标题】:pandas filling nans by mean of before and after non-nan valuespandas 通过非 nan 值之前和之后填充 nans
【发布时间】:2020-08-25 04:53:24
【问题描述】:

我想用相邻元素的平均值填充dfnan

考虑一个数据框:

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

我想要的输出是:

    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

我已经研究过其他解决方案,例如Fill cell containing NaN with average of value before and after,但如果两个或多个连续的np.nans,这将不起作用。

非常感谢任何帮助!

【问题讨论】:

  • 您真的希望两个或多个连续的NaN 填充相同的值吗?你真的不想要定义值之间的线性插值吗?
  • @pipe 我确实想到了它,但似乎比填充average 过于复杂且计算量更大,这没有必要,因为我的实际数据集可以超过数千万行。跨度>
  • df.val.interpolate(limit=1).fillna(method="ffill")

标签: python pandas


【解决方案1】:

使用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

编辑:如果第一个和最后一个元素包含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

【讨论】:

  • 这真是太棒了。非常感谢:)
  • @Chris 很高兴为您提供帮助。
  • 如果第一个和最后一个元素是nan。然后在使用上述方案后使用df.bfill().ffill()
  • @Dark 很棒的建议 :) 感谢您的洞察
  • 很好的答案!你刚刚保存了我的几个 df.iterrows() :D
【解决方案2】:

尽管在多个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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2021-04-15
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多