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 填充的参数......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)
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)
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |