根据值减去pandas数据帧中的每个单元格

时间:2018-01-12 18:30:57

标签: python pandas

我有一个这样的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)来应用它。我没有收到任何错误,但似乎没有应用该功能。

3 个答案:

答案 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))

此处,m1m2是从之前计算的掩码。

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(原始代码无法调整那个)的情况。