gpt4 book ai didi

python - Pandas ffill 限制组 nan 仅小于限制

转载 作者:行者123 更新时间:2023-11-28 20:59:16 24 4
gpt4 key购买 nike

我希望在我的 pandas 数据框中转发填充一些值,但有一个限制。但是,限制只需要填充连续 nan 计数小于或等于限制的 nan 组。这是一个例子,

创建一个缺少数据的df,

import numpy as np
import pandas as pd

df = pd.DataFrame(
{'val': [1, 1, np.nan, np.nan, 2, 3, np.nan, np.nan, np.nan, np.nan, 1, 1]}
)

print(df)

val
0 1.0
1 1.0
2 NaN
3 NaN
4 2.0
5 3.0
6 NaN
7 NaN
8 NaN
9 NaN
10 1.0
11 1.0

现在如果我们 ffill 它会向前填充最多 2 步的所有 nan,

print(df.ffill(limit=2))

val
0 1.0
1 1.0
2 1.0
3 1.0
4 2.0
5 3.0
6 3.0 #
7 3.0 #
8 NaN
9 NaN
10 1.0
11 1.0

当我不希望他们这样做时,那些用# fill 读取(上图)。我想要的是得到以下内容,

print(df.ffill(limit=2, dont_fill_any_nan_gaps_bigger_than_limit=True))

val
0 1.0
1 1.0
2 1.0
3 1.0
4 2.0
5 3.0
6 NaN #
7 NaN #
8 NaN
9 NaN
10 1.0
11 1.0

当然这不需要是 ffill 中的单个参数,而是具有相同效果的东西。

最佳答案

我从这两个出色的答案以及这个 answer 中获得灵感从 jezral 到我以前的 question将其应用于整个 DataFrame。

我这样做是为了一次性处理整个 DataFrame,这样每一列都会填充各自列中的缺失值(使用我的额外约束)。

设置一个DataFrame,

df = pd.DataFrame(
{'val1': [1, 1, np.nan, np.nan, 2, 3, np.nan, np.nan, np.nan, np.nan, 1, 1],
'val2': [1, 2, np.nan, np.nan, 2, 4, 4, np.nan, np.nan, np.nan, np.nan, 2]}
)

print(df)

val1 val2
0 1.0 1.0
1 1.0 2.0
2 NaN NaN
3 NaN NaN
4 2.0 2.0
5 3.0 4.0
6 NaN # 4.0
7 NaN # NaN #
8 NaN # NaN #
9 NaN # NaN #
10 1.0 NaN #
11 1.0 2.0

现在做maskffill

mask_df = (
df.isnull()
.groupby([df.notnull().all(axis=1).cumsum()])
.rank(method='max') - 1
).gt(2)

df = df.ffill().mask(mask_df)
print(df)

val1 val2
0 1.0 1.0
1 1.0 2.0
2 1.0 2.0
3 1.0 2.0
4 2.0 2.0
5 3.0 4.0
6 NaN # 4.0
7 NaN # NaN #
8 NaN # NaN #
9 NaN # NaN #
10 1.0 NaN #
11 1.0 2.0

解释

我们 groupby 使用非 nan 值的累积和。这意味着 nan 值组合在一起。如果我们取这些的最大 rank,我们将得到 nan 序列的长度 + 1。现在我们只需使用 mask 函数,如下所示cᴏʟᴅsᴘᴇᴇᴅ的answer .

关于python - Pandas ffill 限制组 nan 仅小于限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49940652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com