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
不是这里的答案。