我正在尝试用最后一个非零值替换分组序列中的所有最后一个零。因此,下面的代码:
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)我想要达到这个结果
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之间的零仍然存在,但结尾的零都是向前填充的。
请看下面我是如何干净利落地获取最后一个非零值的索引的,但无法完成其余的工作。
a.groupby('item').apply(lambda x : [x != 0].index[-1])发布于 2020-02-14 17:22:42
如果可能,使用原始DataFrame将0替换为missing values by DataFrame.mask,然后在另一个mask中使用ffill仅向前填充最后一个缺少的值,这是通过使用check NaNs回填进行测试的:
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,然后重塑回来:
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每组都有类似的想法:
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.0https://stackoverflow.com/questions/60223238
复制相似问题