繁体   English   中英

根据值减去熊猫数据框中的每个单元格

[英]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))

这里, 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)) 

您可以尝试以下方法:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM