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

时间:2019-06-20 14:33:00

标签: python pandas

我正在尝试实现一个简单的函数,该函数将允许我迭代查找不为空的值,并且该值将存储在名为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

enter image description here

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

enter image description here

我在寻找什么

enter image description here

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

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

注意

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

1 个答案:

答案 0 :(得分:2)

这是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)