在 Pandas 中具有向后和向前看状态的 Fillna

Posted

技术标签:

【中文标题】在 Pandas 中具有向后和向前看状态的 Fillna【英文标题】:Fillna with backwards and forward looking condition in Pandas 【发布时间】:2020-07-31 19:38:44 【问题描述】:

我正在使用一个数据框,该数据框有一列包含多个 NaN,我想根据以下条件填充: 如果向后和向前最多 3 行有 2 个相等的值,则用该值填充 NaN。

由于这可能不太清楚,下面举几个例子:

  col1                    
0 10    
1 10  
2 NaN
3 NaN
4 NaN
5 10
6 5
7 NaN
8 5
9 NaN
10 NaN
11 NaN
12 NaN
第 2 行中的值在 1 行后退为 10,在前 3 行中为 10。 --> 填充 10 第 3 行中的值在 2 行后退为 10,在前 2 行中为 10。 --> 填充 10 第 4 行中的值在 3 行后退为 10,在前 1 行中为 10。 --> 用 10 填充 第 7 行中的值有一个 5 at 1 row 后退和 5 in 1 row 前进。 --> 用 5 填充 第 9 行中的值在 1 行后退为 5,但在前 3 行中没有 5。 --> 那么,就不要填写了

那么,结果会是这样的:

  col1                    
0 10    
1 10  
2 10
3 10
4 10
5 10
6 5
7 5
8 5
9 NaN
10 NaN
11 NaN
12 NaN

我可以使用任何功能将此逻辑提供给fillna吗?

谢谢!!

【问题讨论】:

fillna() 的文档指出该方法仅支持ffillbackfill(也分别称为padbfill)。您必须自己实现一个函数来解决问题。 【参考方案1】:

您可以将前向填充和后向填充Series 与限制参数进行比较,将链掩码与& 进行按位与仅用于缺少值的行,并将其替换为前向填充列:

m1 = df['col1'].isna()
f = df['col1'].ffill(limit=3)
m2 = f.eq(df['col1'].bfill(limit=3))

df['col2'] = df['col1'].mask(m1 & m2, f)
print (df)
    col1  col2
0   10.0  10.0
1   10.0  10.0
2    NaN  10.0
3    NaN  10.0
4    NaN  10.0
5   10.0  10.0
6    5.0   5.0
7    NaN   5.0
8    5.0   5.0
9    NaN   NaN
10   NaN   NaN
11   NaN   NaN
12   NaN   NaN

【讨论】:

工作就像一个魅力!我不知道mask() 函数。谢谢。

以上是关于在 Pandas 中具有向后和向前看状态的 Fillna的主要内容,如果未能解决你的问题,请参考以下文章

ag-grid:水平向后和向前滚动后,在自定义单元格渲染器中发现服务未定义

如何向后和向前循环 Flash 电影的一部分(“乒乓”循环)

向后搜索视觉模式选择

ffplay自定义命令寻求5而不是10秒

替换花括号中的逗号

Java中Date类型如何向前向后滚动时间,( 附工具类)