在下面的示例数据框中,我的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和名称:-
如果当前值不为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)
答案 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