如何在熊猫数据框中应用类似于当前行和无界前面之间的行的窗口?

时间:2018-09-02 03:32:38

标签: python pandas

在下面的示例数据框中,我的ID为:即ID,不同年份的名称和具有不同值的四分之一

id name year quater value 
1  bn   2017 2
1  bn   2017 3     4.5
1  bn   2017 4
1  bn   2018 1
1  bn   2018 2
1  bn   2018 3
2  an   2017 2     2.3   
2  an   2017 3     3.3
2  an   2017 4     4.5
2  an   2018 1   
2  an   2018 2
2  an   2018 3

对于给定的ID和名称:-

  1. 如果当前值为null,并且没有先前的值,或者所有先前的值为null,则状态为2
  2. 如果当前值为null,并且该四分之一以上的任何值和 年不为空,则状态为0
  3. 如果当前值不为null并且该四分之一以上的所有值 并且年份为空或没有前一个,则状态为1
  4. 如果当前值不为null并且该四分之一以上的任何值和 年不为空,则状态为0

    1-新 0-不是新的 2-不确定

结果应为:-

id name year quater value status
1  bn   2017 2            2
1  bn   2017 3     4.5    1
1  bn   2017 4            0
1  bn   2018 1            0
1  bn   2018 2            0
1  bn   2018 3            0
2  an   2017 2     2.3    1 
2  an   2017 3     3.3    0
2  an   2017 4     4.5    0
2  an   2018 1            0
2  an   2018 2            0
2  an   2018 3            0

这将有助于识别ID和名称是否为new(1)/ existing(0)/ notsure(2)

1 个答案:

答案 0 :(得分:1)

df = df.fillna(0)
df.loc[:, 'cum_value'] = df.groupby(['id', 'name']).value.cumsum()

def get_status(value, cum_value):
    if value!=0 and value == cum_value:
        return 1
    elif value==0 and cum_value==0:
        return 2
    else:
        return 0

df.loc[:, 'status'] = df.apply(lambda row: get_status(row['value'], row['cum_value'] ), axis=1)

我将NaN的值更改为0,以简化操作。如果您想将它们改回NaN,则可以轻松地进行操作,例如:

import numpy as np
df.loc[df['value'] == 0, 'value'] = np.NaN