我正在尝试实现一个简单的函数,该函数将允许我迭代查找不为空的值,并且该值将存储在名为prv_djma的新列中。

数据

data = {'id_st': [100, 100, 100, 100, 100, 100, 100, 100, 100],
    'year':  [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018],
    'djma':  [1000, 2200, 0, 3000, 1000, 0, 2000, 0, 0],
    'taux': [np.nan, 0.9, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 0.7]}

df = pd.DataFrame(data)
df


python - 前N行,直到查找值不为null-LMLPHP

df['prv_djma'] = df['djma'].shift()


python - 前N行,直到查找值不为null-LMLPHP

我在寻找什么

python - 前N行,直到查找值不为null-LMLPHP

目标是检查N行,直到找到一个不为null的djma,然后将该值放在当前行中(列prv_djma)。

例如,带有(索引8)的最后一行的djma = 0,并且(索引7)也是djma = 0,所以我想用djma(索引6)填充prv_djma列。

注意

我的问题出在索引8。所有其他行都是正确的。

最佳答案

这是shift,确保如果存在连续的0,则我们用先前的值填充:

m = df.djma.eq(0)
df['prv_djma'] = df.djma.shift().mask((m == m.shift()) & m).ffill()


输出:

   id_st  year  djma  taux  prev_djma
0    100  2010  1000   NaN        NaN
1    100  2011  2200   0.9     1000.0
2    100  2012     0   1.1     2200.0
3    100  2013  3000   1.2        0.0
4    100  2014  1000   1.3     3000.0
5    100  2015     0   1.4     1000.0
6    100  2016  2000   1.5        0.0
7    100  2017     0   1.6     2000.0
8    100  2018     0   0.7     2000.0




对于组,您需要单独执行此操作,以使.shift不会溢出到组之外。

def get_prv(x):
    m = x.eq(0)
    return x.shift().mask((m == m.shift()) & m).ffill()

df['prv_djma'] = df.groupby('id_st')['djma'].apply(get_prv)

关于python - 前N行,直到查找值不为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56688299/

10-12 23:17