[英]Subtract from each cell in pandas dataframe based on value
我有一个这样的df-这是一个数据框,所有值都是浮点数:
data=np.random.randint(3000,size=(10,1))
data=pd.DataFrame(data)
对于每个值,如果介于570和1140之间,我要减去570。如果大于1140,则要从值中减去1140。 我写了这个函数来做到这一点。
def AdjustTimes(val):
if val > 570 and val < 1140:
val = val-570
elif val > 1140:
val = val - 1140
基于另一个问题,我尝试使用data.applymap(AdjustTimes)
来应用它。 我没有出现错误,但该功能似乎尚未应用。
设定
data
0
0 1863
1 2490
2 2650
3 2321
4 822
5 82
6 2192
7 722
8 2537
9 874
首先,让我们为每个条件创建掩码。 一种熊猫式的方法是使用between
方法为第一个条件检索掩码-
m1 = data.loc[:, 0].between(570, 1140, inclusive=True)
或者,您可以使用几个逻辑运算符来执行此操作-
m1 = data.loc[:, 0].ge(570) & data.loc[:, 0].le(1140)
和,
m2 = data.loc[:, 0].gt(1140)
现在,要执行替换,您有两个选择。
选项1
使用loc
索引并减去-
data.loc[m1, 0] -= 570
data.loc[m2, 0] -= 1140
data
0
0 723
1 1350
2 1510
3 1181
4 252
5 82
6 1052
7 152
8 1397
9 304
pd.Series
等效版本-
m1 = data.ge(570) & data.le(1140) m2 = data.gt(1140) data.loc[m1] -= 570 data.loc[m2] -= 1140
选项2
您也可以使用np.where
来做到这np.where
(但是效率会低一些)。
v = data.loc[:, 0]
data.loc[:, 0] = np.where(m1, v - 570, np.where(m2, v - 1140, v))
这里, m1
和m2
是从之前计算的掩码。
data
0
0 723
1 1350
2 1510
3 1181
4 252
5 82
6 1052
7 152
8 1397
9 304
等效的pd.Series
代码-
data[:] = np.where(m1, data - 570, np.where(m2, data - 1140, data))
您可以尝试以下方法:
data=np.random.randint(3000,size=(10,1))
data=pd.DataFrame(data)
data = data -570*((data > 570) & (data < 1140)) -1140*(data > 1140)
applymap方法旨在生成新的数据框,而不是修改现有的数据框(并且它调用的函数应为新单元格返回一个值,而不是修改其参数)。 您没有在实际使用applymap的地方显示该行,但我怀疑它只是data.applymap(AdjustTimes)
本身。 如果将代码更改为以下代码,则应该可以正常工作:
def AdjustTimes(val):
if val >= 1140:
return val - 1140
elif val >= 570:
return val - 570
data = data.applymap(AdjustTimes)
(我还整理了if
语句,使其速度更快一些,并处理了Val = 1140的情况(您的原始代码无法调整该语句)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.