Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当且仅当最后一个和下一个非缺失值为1时,如何用1填充熊猫系列中缺失的值_Python_Pandas - Fatal编程技术网

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

Python 当且仅当最后一个和下一个非缺失值为1时,如何用1填充熊猫系列中缺失的值,python,pandas,Python,Pandas,我有一个熊猫系列,只有0、1和np.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]) 我想填充缺失的值,但我的逻辑是将np.nan值替换为1,当且仅当上一个和下一个非缺失值也为1时,否则为0。因此,预期产出为: pd.Se

我有一个熊猫系列,只有
0
1
np.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])
我想填充缺失的值,但我的逻辑是将
np.nan
值替换为1,当且仅当上一个和下一个非缺失值也为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])

我该怎么做呢?

按照您的插补处方,如果需要插补,第一个和最后一个元素总是
0
。您可以通过范围(1,len(vals)-1)内i的所有索引对
vals=ds.值运行检查
。完成后,重新分配到序列并为第一个和最后一个值插补
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')

请注意,这会导致在第三个
1
之后输入
1
(原始数据),而它应该是
0
。我按原样使用了您的数据并检查了结果。你的意思是你想要的数据不同吗?它是不同的。检查第15个元素(在索引14处)。您的第15个元素是NaN,因为第14个元素是1,所以第15个元素是1,带有
method='ffill'
。根据我的预期输出,它应该是0。因此,
ffill
不是这里的答案。