每当在python中的数据帧列中找到0值时,我想替换前一行值。我使用了以下代码,
if not a[j]:
a[j] = a[j-1]
以及
if a[j]==0:
a[j]=a[j-1]
更新
更新完整代码:
for i in pd.unique(r.a):
sub=r[r.vehicle_id==i]
sub=DataFrame(sub,columns= ['a','b','c','d','e'])
sub=sub.drop_duplicates(["a","b","c","d"])
sub['c']=pd.to_datetime(sub['c'],unit='s')
for j in range(1, len(sub[1:])):
if not sub.d[j]:
sub.d[j] = sub.d[j-1]
if not sub.e[j]:
sub.e[j]=sub.e[j-1]
sub=sub.drop_duplicates(["lash_angle","lash_check_count"])
这是我的代码的开头。 sub.d [j]行只会延迟
使用整数值时,这两者似乎都运行良好。其中一列包含十进制值。使用该列的代码时,需要花费大量时间才能完成(大约15-20秒)语句。我循环了近10000个ID并且在此步骤浪费了15秒,这使得我的整个代码效率低下。有没有更好的方法,我可以为浮点(十进制)值执行此操作,以便它会更快?
由于
答案 0 :(得分:0)
假设你通过“数据帧的列”表示你实际上是在谈论pandas DataFrame的一个列(系列),那么一个技巧就是用0替换0然后再用前向填充。例如:
>>> df = pd.DataFrame(np.random.randint(0,4, 10**6))
>>> df.head(10)
0
0 0
1 3
2 3
3 0
4 1
5 2
6 3
7 2
8 0
9 3
>>> df[0] = df[0].replace(0, np.nan).ffill()
>>> df.head(10)
0
0 NaN
1 3
2 3
3 3
4 1
5 2
6 3
7 2
8 2
9 3
您可以自己决定如何在开始时处理0的情况,您无需填写任何值。这假设您不希望单独留下NaN值,但如果有,则可以使用.loc
的掩码仅选择要更改的掩码。