首页 > 解决方案 > Pandas Dataframe 根据算术距离有条件地更改值

问题描述

我有一个在“a”列中权重的熊猫数据框。我只想在权重变化超过 0.05(在两个方向上)并保存结果列“a_1”时才更改权重。是否可以在不使用循环的情况下做到这一点?

date            a     a_1
2017-06-30     0.72   0.72  
2017-07-01     0.74   0.72    
2017-07-02     0.71   0.72
2017-07-03     0.70   0.72
2017-07-04     0.67   0.72
2017-07-05     0.66   0.66    --> difference is -0.06 < -0.05    
2017-07-06     0.65   0.66 
2017-07-07     0.76   0.76    --> difference is +0.10 > +0.05 
2017-07-08     0.77   0.76
2017-07-09     0.78   0.76
2017-07-10     0.74   0.76
2017-07-11     0.69   0.70    --> difference is -0.07 < -0.05
2017-07-12     0.73   0.70
2017-07-13     0.73   0.70

标签: pandasdataframe

解决方案


你可以使用 Pandas 的apply方法,这对你来说比 for 循环更可取吗?

不幸的是,这将意味着更改函数内部的全局变量。如果你能忍受,以下工作:

number_to_compare = 0

def get_weight(row):
    global number_to_compare
    if abs(row.a - number_to_compare) > 0.05:
        number_to_compare = row.a
        return row.a
    return number_to_compare

df['a_1'] = df.apply(get_weight, axis=1)

输出:

               a    a_1
date        
2017-06-30  0.72    0.72
2017-07-01  0.74    0.72
2017-07-02  0.71    0.72
2017-07-03  0.70    0.72
2017-07-04  0.67    0.72
2017-07-05  0.66    0.66
2017-07-06  0.65    0.66
2017-07-07  0.76    0.76
2017-07-08  0.77    0.76
2017-07-09  0.78    0.76
2017-07-10  0.74    0.76
2017-07-11  0.69    0.69
2017-07-12  0.73    0.69
2017-07-13  0.73    0.69

推荐阅读