Ben*_*751 7 interpolation dataframe python-3.x pandas
我想插入一个 pandas 数据框,但我找不到解决我的问题的简单方法。这是我的熊猫 df:
df = pandas.DataFrame(numpy.array([numpy.nan, 1, 1, numpy.nan, \
numpy.nan, 1, numpy.nan, numpy.nan, numpy.nan, numpy.nan, 1]),columns=['a'])
a
0 NaN
1 1.0
2 1.0
3 NaN
4 NaN
5 1.0
6 NaN
7 NaN
8 NaN
9 NaN
10 1.0
Run Code Online (Sandbox Code Playgroud)
我想要以下结果:
a
0 NaN
1 1.0
2 1.0
3 1.0
4 1.0
5 1.0
6 NaN
7 NaN
8 NaN
9 NaN
10 1.0
Run Code Online (Sandbox Code Playgroud)
为此,我使用插值函数,但它总是推断数据:
df2=df.interpolate(limit=2, limit_area='inside' ,method='linear')
a
0 NaN
1 1.0
2 1.0
3 1.0
4 1.0
5 1.0
6 1.0
7 1.0
8 NaN
9 NaN
10 1.0
Run Code Online (Sandbox Code Playgroud)
仅当限制参数范围内存在非 NaN 值时是否可以进行插值?(即:第 6 行和第 7 行的值应该是 NaN,因为第 8 行也是 NaN)。我的印象是 limit_area 仅适用于 df 的末尾。
谢谢
要实现您想要的目标,首先创建一个系列,该系列计算NaN每组的连续值的数量NaN并将该值广播回组中的每行。然后对整个系列进行插值,并使用mask不NaN应该插值的所有内容。
s = df['a'].notnull()
s = s.ne(s.shift()).cumsum()
m = df.groupby([s, df['a'].isnull()])['a'].transform('size').where(df['a'].isnull())
#0 1.0
#1 NaN
#2 NaN
#3 2.0
#4 2.0
#5 NaN
#6 4.0
#7 4.0
#8 4.0
#9 4.0
#10 NaN
df.interpolate(limit_area='inside', method='linear').mask(m>2)
Run Code Online (Sandbox Code Playgroud)
a
0 NaN
1 1.0
2 1.0
3 1.0
4 1.0
5 1.0
6 NaN
7 NaN
8 NaN
9 NaN
10 1.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1429 次 |
| 最近记录: |