我有一个这样的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)
来应用它。我没有收到任何错误,但似乎没有应用该功能。
答案 0 :(得分:2)
<强>设置强>
data
0
0 1863
1 2490
2 2650
3 2321
4 822
5 82
6 2192
7 722
8 2537
9 874
首先,让我们为您的每个条件创建遮罩。一种pandaic方法是使用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
执行此操作(但效率会更低)。
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))
答案 1 :(得分:0)
你可以试试像:
data=np.random.randint(3000,size=(10,1))
data=pd.DataFrame(data)
data = data -570*((data > 570) & (data < 1140)) -1140*(data > 1140)
答案 2 :(得分:0)
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(原始代码无法调整那个)的情况。