在数据框列中将负值剪切为0(Pandas)

9

我正在进行关于pandas系列数据框的简单数学方程计算,但是在编译大量数据时,一些值会变成负数。有没有代码可以添加,以确保减法运算的值只到达最小值为零?这是我目前的代码:

deltaT['data'] = (deltaT['hws'] - deltaT['hwr'])

谢谢!


使用deltaT.iloc[deltaT < 0, 'data'] = 一些值,例如0。 - seralouk
4个回答

10
你可以选择使用clip_lower来在单个操作中完成。
deltaT['data'] = (deltaT['hws'] - deltaT['hwr']).clip_lower(0)

1
clip_lower适用于数据框,而不是系列。它会返回AttributeError:'Series'对象没有'clip_lower'属性。 - branwen85
1
在问题中,你可以看到他们有一个数据框。你也可以直接使用np.clip - miradulo
1
clip_lower()自版本0.24.0起已被弃用:请改用clip(lower=threshold)。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.clip.html - Azrael_DD

5
您可以创建 deltaT['data'],然后使用 df.loc 将负值设置为0。
deltaT['data'] = (deltaT['hws'] - deltaT['hwr'])
deltaT.loc[deltaT['data'] < 0, 'data'] = 0

4

选项1
简单

deltaT['data'] = deltaT.eval('(hws - hwr) * (hws > hwr)')

考虑deltaT。
deltaT = pd.DataFrame(dict(hws=[5, 8], hwr=[8, 5]))

deltaT.assign(data=deltaT.eval('(hws - hwr) * (hws > hwr)'))

   hwr  hws  data
0    8    5     0
1    5    8     3

选项2
与选项1相同,但使用numpy数组

r, s = (deltaT[c].values for c in ['hwr', 'hws'])
deltaT.assign(data=(s - r) * (s > r))

   hwr  hws  data
0    8    5     0
1    5    8     3

选项3 有创意的尝试
deltaT.assign(data=deltaT.eval('hws - hwr').to_frame().assign(_=0).max(1))

   hwr  hws  data
0    8    5     0
1    5    8     3

4
deltaT['data'] = (deltaT['hws'] - deltaT['hwr']).apply(lambda x: max(x, 0))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接