前N行,直到找不到值

2024-07-03 06:50:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个简单的函数,它允许我迭代回来寻找一个非空值,这个值将被存储在一个名为prv\u 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行,直到找到一个非空的djma,然后将值放入当前行(prv\u djma列)。你知道吗

例如,带有(索引8)的最后一行的djma=0,(索引7)也是djma=0,所以我想用djma(索引6)填充prv\u djma列。你知道吗

注意

我的问题在索引8中。所有其他行都正确。你知道吗


Tags: 数据函数iddataframedfdatanpnan
1条回答
网友
1楼 · 发布于 2024-07-03 06:50:34

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

相关问题 更多 >