基于一列在另一列的+/- 5%范围内创建指标列

时间:2018-03-12 16:25:32

标签: python pandas

我想填写指标'列基于两个充电列。如果' Charge1'在' Charge2'的正负5%范围内。价值,设置指标'到RFP,否则留空(见下面的例子)。

ID  Charge1  Charge2  Indicator
1   9.5      10       RFP
2   22       20 
3   41       40       RFP
4   65       80 
5   160      160      RFP
6   315      320      RFP
7   613      640      RFP
8   800      700    
9   759      800    
10  1480     1500     RFP

我尝试使用.loc方法,但很难确定是否' Charge1'在Charge2'的范围内+/- 5%。

5 个答案:

答案 0 :(得分:3)

In [190]: df.loc[df.eval("Charge2*0.95 <= Charge1 <= Charge2*1.05"), 'RFP'] = 'REP'

In [191]: df
Out[191]:
   ID  Charge1  Charge2  RFP
0   1      9.5       10  REP
1   2     22.0       20  NaN
2   3     41.0       40  REP
3   4     65.0       80  NaN
4   5    160.0      160  REP
5   6    315.0      320  REP
6   7    613.0      640  REP
7   8    800.0      700  NaN
8   9    759.0      800  NaN
9  10   1480.0     1500  REP

答案 1 :(得分:2)

非常简单,创建一个&#39;指标&#39;一系列布尔值取决于Charge1和Charge2之间的百分比差异。

df = pd.read_clipboard()
threshold = 0.05
indicator = ( (df['Charge1'] / df['Charge2']) - 1).abs() <= threshold
df.loc[indicator]

设置一个阈值数字并将值与之比较。

只要值在阈值范围内,返回true,这样就可以直接使用指标(布尔系列)作为.loc的输入。

答案 2 :(得分:2)

您可以使用pct_change

df[['Charge2','Charge1']].T.pct_change().dropna().T.abs().mul(100).astype(int)<=(5)
Out[245]: 
   Charge1
0     True
1    False
2     True
3    False
4     True
5     True
6     True
7    False
8     True
9     True

答案 3 :(得分:2)

尝试

cond = ((df['Charge2'] - df['Charge1'])/df['Charge2']*100).abs() <= 5
df['Indicator'] = np.where(cond, 'RFP', np.nan)


    ID  Charge1 Charge2 Indicator
0   1   9.5     10      RFP
1   2   22.0    20      nan
2   3   41.0    40      RFP
3   4   65.0    80      nan
4   5   160.0   160     RFP
5   6   315.0   320     RFP
6   7   613.0   640     RFP
7   8   800.0   700     nan
8   9   759.0   800     nan
9   10  1480.0  1500    RFP

答案 4 :(得分:1)

要非常小心!

在Python /浮点计数中,9.5/10 - 1 == -0.050000000000000044

这是通过numpy明确说明此问题的一种方法。

import numpy as np

vals = np.abs(df.Charge1.values / df.Charge2.values - 1)
cond1 = vals <= 0.05
cond2 = np.isclose(vals, 0.05, atol=1e-08)

df['Indicator'] = np.where(cond1 | cond2, 'RFP', '')