Pandas DataFrame:如何用 0 填充“nan”,但有效值之间仅存在 nan?

use*_*632 4 python dataframe pandas

我想做的事:

In [2]: b = pd.DataFrame({"a": [np.nan, 1, np.nan, 2, np.nan]})
Out[2]:
      a
0   nan
1 1.000
2   nan
3 2.000
4   nan
Run Code Online (Sandbox Code Playgroud)

预期输出:

      a
0   nan
1 1.000
2   0
3 2.000
4   nan
Run Code Online (Sandbox Code Playgroud)

正如您在此处看到的,只有被有效值包围的 nan 才会被替换为 0。

我怎样才能做到这一点?

  • df.interpolate(limit_area='inside') 对我来说看起来不错,但它没有用 0 填充的参数......

Erf*_*fan 6

方法 1:interpolate、isna、notna和loc

您可以使用interpolate然后检查NaN原始数据中的哪些位置以及插值中填充的位置,然后将这些值替换为0:

s = df['a'].interpolate(limit_area='inside')

m1 = b['a'].isna()
m2 = s.notna()

df.loc[m1&m2, 'a'] = 0

     a
0  NaN
1  1.0
2  0.0
3  2.0
4  NaN
Run Code Online (Sandbox Code Playgroud)

方法 2:shift和loc:

一种更简单的方法是检查上一行和下一行是否是not NaN并用以下内容填充这些位置0:

m1 = df['a'].shift().notna()
m2 = df['a'].shift(-1).notna()
m3 = df['a'].isna()

df.loc[m1&m2&m3, 'a'] = 0

     a
0  NaN
1  1.0
2  0.0
3  2.0
4  NaN
Run Code Online (Sandbox Code Playgroud)