Pandas DataFrame 用前面最新的正值替换负值
Pandas DataFrame replace negative values with latest preceding positive value
考虑 DataFrame
例如
df = pd.DataFrame({'a': [1,-2,0,3,-1,2],
'b': [-1,-2,-5,-7,-1,-1],
'c': [-1,-2,-5,4,5,3]})
对于每一列,如何用最后一个正值或零替换任何负值?此处最后指的是每列从上到下。例如,最接近的解决方案是 df[df < 0] = 0
.
预期结果将是DataFrame
,例如
df_res = pd.DataFrame({'a': [1,1,0,3,3,2],
'b': [0,0,0,0,0,0],
'c': [0,0,0,4,5,3]})
您可以使用 DataFrame.mask
将所有值 < 0
转换为 NaN
然后使用 ffill
和 fillna
:
df = df.mask(df.lt(0)).ffill().fillna(0).convert_dtypes()
a b c
0 1 0 0
1 1 0 0
2 0 0 0
3 3 0 4
4 3 0 5
5 2 0 3
使用pandas,其中
df.where(df.gt(0)).ffill().fillna(0).astype(int)
a b c
0 1 0 0
1 1 0 0
2 1 0 0
3 3 0 4
4 3 0 5
5 2 0 3
通过此操作可以获得预期结果:
mask = df >= 0 #creating boolean mask for non-negative values
df_res = (df.where(mask, np.nan) #replace negative values to nan
.ffill() #apply forward fill for nan values
.fillna(0)) # fill rest nan's with zeros
考虑 DataFrame
例如
df = pd.DataFrame({'a': [1,-2,0,3,-1,2],
'b': [-1,-2,-5,-7,-1,-1],
'c': [-1,-2,-5,4,5,3]})
对于每一列,如何用最后一个正值或零替换任何负值?此处最后指的是每列从上到下。例如,最接近的解决方案是 df[df < 0] = 0
.
预期结果将是DataFrame
,例如
df_res = pd.DataFrame({'a': [1,1,0,3,3,2],
'b': [0,0,0,0,0,0],
'c': [0,0,0,4,5,3]})
您可以使用 DataFrame.mask
将所有值 < 0
转换为 NaN
然后使用 ffill
和 fillna
:
df = df.mask(df.lt(0)).ffill().fillna(0).convert_dtypes()
a b c
0 1 0 0
1 1 0 0
2 0 0 0
3 3 0 4
4 3 0 5
5 2 0 3
使用pandas,其中
df.where(df.gt(0)).ffill().fillna(0).astype(int)
a b c
0 1 0 0
1 1 0 0
2 1 0 0
3 3 0 4
4 3 0 5
5 2 0 3
通过此操作可以获得预期结果:
mask = df >= 0 #creating boolean mask for non-negative values
df_res = (df.where(mask, np.nan) #replace negative values to nan
.ffill() #apply forward fill for nan values
.fillna(0)) # fill rest nan's with zeros