我正在尝试实现一个简单的函数,该函数将允许我迭代查找不为空的值,并且该值将存储在名为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
df['prv_djma'] = df['djma'].shift()
我在寻找什么
目标是检查N行,直到找到一个不为null的djma,然后将该值放在当前行中(列prv_djma)。
例如,带有(索引8)的最后一行具有djma = 0,并且(索引7)也是djma = 0,因此我想用djma(索引6)填充prv_djma列。
注意
我的问题出在索引8。所有其他行都是正确的。
答案 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)