根据一列中的多个条件创建一个新列

时间:2019-07-19 01:41:47

标签: python pandas data-science analysis

第1步:我有一个数据框,我想在其中找到一个元素与列C中另一个元素的区别(df.series.diff())。

第2步:如果与第1步相比,元素差达到阈值大于4,并且连续超过2个连续行,但减少的幅度不超过2倍(我要在新列中标记它)。

想得到这个结果:

    A           B(time)    C(load)       D(New column with logic) 
  account 1     0            1           N        
  account 1     1:00         2.2         N   
  account 1     2:00         3.3         N
  account 1     3:00         9.6         N 
  account 1     4:00         10          Y
  account 1     5:00         12          Y 
  account 1     6:00         9           Y
  account 1     7:00         2.3         N
  account 1     8:00         6.5         N   
  account 1     9:00         7.0         Y

到目前为止,我已经尝试过此方法,但是它不能仅在and之前的第一部分起作用:

    df['new']=df.load.diff(1).cumsum().ge(4) & df.load.diff(1).le(2)

2 个答案:

答案 0 :(得分:0)

尝试使用 更改

df['new']=df.load.diff(1).cumsum().ge(4) & df.load.diff(1).le(2)

答案 1 :(得分:0)

使用构建的示例数据库

df = pd.DataFrame(data={"A": ['account 1', 'account 1','account 1','account 1','account 1','account 1', 'account 1', 'account 1', 'account 1', 'account 1'], 
                                "B(time)": [0, 1 ,2,3,4,5, 6, 7, 8, 9],
                                "C(load)": [1, 2.2, 3.3, 9.6, 10, 12, 9, 2.3, 6.5, 7.0]}) 

是:

    A           B(time) C(load)
0   account 1      0    1.0
1   account 1      1    2.2
2   account 1      2    3.3
3   account 1      3    9.6
4   account 1      4    10.0
5   account 1      5    12.0
6   account 1      6    9.0
7   account 1      7    2.3
8   account 1      8    6.5
9   account 1      9    7.0

如果您写:

df['new']=df['C(load)'].diff(1).cumsum().ge(4) & df['C(load)'].diff(1).le(2)

结果是:

     A        B (time) C(load)  new
0   account 1     0    1.0     False
1   account 1     1    2.2     False
2   account 1     2    3.3     False
3   account 1     3    9.6     False
4   account 1     4    10.0    True
5   account 1     5    12.0    True
6   account 1     6    9.0     True
7   account 1     7    2.3     False
8   account 1     8    6.5     False
9   account 1     9    7.0     True