当且仅当最后一个和下一个非缺失值为1时,如何用1填充Pandas系列中缺失的值

2024-10-11 16:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个只带有01np.nan值的熊猫系列:

pd.Series([0, np.nan, np.nan, 0, np.nan, np.nan, np.nan, 1, np.nan, 1, np.nan, 
np.nan, np.nan, 1, np.nan, 0, np.nan, np.nan, 1, np.nan, np.nan, np.nan, 1])

我想填充缺少的值,但我的逻辑是用1替换np.nan值,当且仅当上一个和下一个非缺少的值也为1,否则为0。因此,预期产出为:

pd.Series([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1])

我该怎么做


Tags: np逻辑nanseriespd
3条回答

根据您的插补处方,如果需要插补,第一个和最后一个元素始终为0。您可以通过vals[i-1]*vals[i+1] == 1上的所有索引for i in range(1, len(vals)-1)vals = ds.values运行检查,否则设置vals[i]=10。完成后,重新分配到序列并为第一个和最后一个值输入ds.fillna(0)

没有内置的方法可以做到这一点,您必须为此编写自己的代码

import pandas as pd
import numpy as np

s = pd.Series([0, np.nan, np.nan, 0, np.nan, np.nan, np.nan, 1, np.nan, 1, np.nan,
               np.nan, np.nan, 1, np.nan, 0, np.nan, np.nan, 1, np.nan, np.nan, np.nan, 1])

vals = s.values.tolist()
look_left = [-1] * len(vals)
look_right = [-1] * len(vals)

for i in range(2):
    check = vals if i == 0 else vals[::-1]
    arr = look_left if i == 0 else look_right
    prev_seen = None
    for i, elem in enumerate(check):
        if elem in [0, 1]:
            arr[i] = elem
            prev_seen = elem
        else:
            arr[i] = prev_seen

look_right = look_right[::-1]

for i in range(len(vals)):

    if np.isnan(vals[i]):
        vals[i] = 1 if look_right[i] == 1 and look_left[i] == 1 else  0

s = pd.Series(vals)
print(s)

fillna向前填充值

df.fillna(method='ffill')

相关问题 更多 >

    热门问题