在 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()
的文档指出该方法仅支持ffill
或backfill
(也分别称为pad
和bfill
)。您必须自己实现一个函数来解决问题。
【参考方案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:水平向后和向前滚动后,在自定义单元格渲染器中发现服务未定义