Python 仅当值为有限且非零时,才将值从一个系列/数据帧复制到另一个系列/数据帧,当值为非有限且为零时,保留现有值

Python 仅当值为有限且非零时,才将值从一个系列/数据帧复制到另一个系列/数据帧,当值为非有限且为零时,保留现有值,python,pandas,dataframe,series,Python,Pandas,Dataframe,Series,我有一个序列,它有值和零,保存给定时间点的当前读数(newv)。零表示给定读数集没有新读数。我想用最后一个已知值(vals)维护另一个序列 为此,您应该能够将非零值从保存当前值的序列复制到具有最后一个已知值的序列,并且在当前值的读数为零时保留最后一个已知值中的值(生成的VAL) 如何将这些数据结构维护为系列和数据帧 例如 给定vals=pd.Series([1,2,3,4,5,6,7,8,9])和newv=pd.Series([0,22,0,44,0,0,0,0,0,0,0])我想得到vals

我有一个序列,它有值和零,保存给定时间点的当前读数(
newv
)。零表示给定读数集没有新读数。我想用最后一个已知值(
vals
)维护另一个序列

为此,您应该能够将非零值从保存当前值的序列复制到具有最后一个已知值的序列,并且在当前值的读数为零时保留最后一个已知值中的值(生成的
VAL

如何将这些数据结构维护为系列和数据帧


例如

给定
vals=pd.Series([1,2,3,4,5,6,7,8,9])
newv=pd.Series([0,22,0,44,0,0,0,0,0,0,0])
我想得到
vals=pd.Series([1,22,3,44,5,6,7,8,9])


给定
vals=pd.Series([1,22,3,44,5,6,7,8,9])
newv=pd.Series([11,0,33,0,0,0,0,0,0,0,0,0])
在下一次迭代中,我想得到
vals=pd.Series([11,22,33,44,5,6,7,8,9])
Ok,对于更新的示例,我认为您只需要为
vals
分配新值,只要
newv
大于零。这样做:

vals = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9])
newv = pd.Series([0, 22, 0, 44, 0, 0, 0, 0, 0])
vals.loc[newv>0] = newv
df = pd.DataFrame()
df['vals'] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
df['new1'] = [0, 22, 0, 44, 0, 0, 0, 0, 0]
df['new2'] = [11, 0, 33, 0, 0, 0, 0, 0, 0]
df['last_known'] = df.apply(lambda x: x[x>0].iloc[-1], axis=1)
如果您有一个包含几个新迭代列的数据帧,您可以使用最后一个已知值创建一个列,如下所示:

vals = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9])
newv = pd.Series([0, 22, 0, 44, 0, 0, 0, 0, 0])
vals.loc[newv>0] = newv
df = pd.DataFrame()
df['vals'] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
df['new1'] = [0, 22, 0, 44, 0, 0, 0, 0, 0]
df['new2'] = [11, 0, 33, 0, 0, 0, 0, 0, 0]
df['last_known'] = df.apply(lambda x: x[x>0].iloc[-1], axis=1)
或者,您可以在
df
的列上应用上一个答案的方法,并在每次迭代时获取当前值:

df.apply(pd.Series.replace, axis=1, to_replace=0, method='ffill')
那会产生什么

   vals  new1  new2
0     1     1    11
1     2    22    22
2     3     3    33
3     4    44    44
4     5     5     5
5     6     6     6
6     7     7     7
7     8     8     8
8     9     9     9

原始答案如下 可以通过使用
NaN
s替换序列中的零值,然后使用
fillna
方法向前填充缺少的值来完成此操作。例如:

import pandas as pd
import numpy as np

s1 = pd.Series([1,2,3,0,0,0,4,0,5])
s2 = s1.replace({0:np.NaN}).fillna(method='ffill')
这是
s2
中的结果:

0    1.0
1    2.0
2    3.0
3    3.0
4    3.0
5    3.0
6    4.0
7    4.0
8    5.0
正如@ayhan在评论中所建议的,更好的方法是使用
替换
,方法参数:

s2 = s1.replace(0, method='ffill')

replace还有一个可以直接使用的方法参数:
s1.replace(0,method='ffill')
谢谢,@ayhan,我不知道这个,它很棒=)。我把它添加到了答案中。谢谢你的尝试。这不是我想要的。我添加了一个例子。@Suminda Sirinath S.Dharmasena,请查看更新的答案。