首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas在序列末尾按ffill零值分组

Pandas在序列末尾按ffill零值分组
EN

Stack Overflow用户
提问于 2020-02-14 17:14:19
回答 1查看 177关注 0票数 3

我正在尝试用最后一个非零值替换分组序列中的所有最后一个零。因此,下面的代码:

代码语言:javascript
复制
a = pd.DataFrame({'a': [1, 2, 0, 3, 5, 0, 0], 'b': [12,0 ,14, 0, 0, 0, 0]})
a.index = [1, 2, 3, 4, 5, 6, 7] 
a = a.unstack() 
a = a.reset_index().set_index('level_1') 
a.columns = ['item', 'value'] 
a.sort_index(inplace=True)

我想要达到这个结果

代码语言:javascript
复制
    item    value
level_1     
1   a   1
1   b   12
2   a   2
2   b   0
3   a   0
3   b   14
4   a   3
4   b   14
5   a   5
5   b   14
6   a   5'
6   b   14
7   a   5
7   b   14

请注意,2到3之间的零和12到14之间的零仍然存在,但结尾的零都是向前填充的。

请看下面我是如何干净利落地获取最后一个非零值的索引的,但无法完成其余的工作。

代码语言:javascript
复制
a.groupby('item').apply(lambda x : [x != 0].index[-1])
EN

回答 1

Stack Overflow用户

发布于 2020-02-14 17:22:42

如果可能,使用原始DataFrame将0替换为missing values by DataFrame.mask,然后在另一个mask中使用ffill仅向前填充最后一个缺少的值,这是通过使用check NaNs回填进行测试的:

代码语言:javascript
复制
df = pd.DataFrame({'a': [1, 2, 0, 3, 5, 0, 0], 'b': [12,0 ,14, 0, 0, 0, 0]})
df.index = [1, 2, 3, 4, 5, 6, 7] 
print (df)
   a   b
1  1  12
2  2   0
3  0  14
4  3   0
5  5   0
6  0   0
7  0   0

df1 = df.mask(df.eq(0))
df =  df.mask(df1.bfill().isna(), df1.ffill())
print (df)
   a   b
1  1  12
2  2   0
3  0  14
4  3  14
5  5  14
6  5  14
7  5  14

如果不是,首先重塑为原始形状,应用解决方案A,然后重塑回来:

代码语言:javascript
复制
df = a.set_index('item', append=True).unstack()
df1 = df.mask(df.eq(0))
df = df.mask(df1.bfill().isna(), df1.ffill()).stack().reset_index(level=1)
print (df)
        item  value
level_1            
1          a      1
1          b     12
2          a      2
2          b      0
3          a      0
3          b     14
4          a      3
4          b     14
5          a      5
5          b     14
6          a      5
6          b     14
7          a      5
7          b     14

每组都有类似的想法:

代码语言:javascript
复制
def f(x):
    m = x['value'].eq(0)
    s = x['value'].mask(m)
    x['value'] = s.fillna(0).mask(s.bfill().isna(), s.ffill())
    return x

df = a.reset_index().groupby('item').apply(f)
print (df)
    level_1 item  value
0         1    a    1.0
1         1    b   12.0
2         2    a    2.0
3         2    b    0.0
4         3    a    0.0
5         3    b   14.0
6         4    a    3.0
7         4    b   14.0
8         5    a    5.0
9         5    b   14.0
10        6    a    5.0
11        6    b   14.0
12        7    a    5.0
13        7    b   14.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60223238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档