Pandas groupwise行值调整

时间:2017-07-19 14:38:11

标签: python pandas lambda group-by

我写了一个lambda函数来调整这样的数据帧:

df = pd.DataFrame({'types':['A','A','A','A','A','B','B','B','B','B'],'disruptions':['N','N','Y','N','N','N','N','N','N','N'],'actions':[0,0,1,0,0,0,0,1,0,0],'status':[0,0,0,1,1,0,0,0,1,1],'status_2':[0,0,0,0,1,0,0,0,1,1]})

我的目标是转换'状态'列进入' status_2'。逻辑是:在相同的类型中'小组,如果'行动'被标记为1& '中断'是' Y',然后是' status_2'的下一行。将为0.否则等于' status'。

这就是我所拥有的:

df['status_2'] = df.groupby('types').apply(lambda x: 0 if x['disruptions'].shift(1) == 'Y' & x['actions'].shift(1) == 1 else x['status'])

错误是:TypeError:无法将dtyped [float64]数组与[bool]类型的标量进行比较。

有人可以指出我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

我认为您需要按groupby创建模板,然后按values转换为numpy array,然后使用Series.maskTrue值得0 },另一个值未受影响:

f = lambda x: (x['disruptions'].shift(1) == 'Y') & (x['actions'].shift(1) == 1)
m = df.groupby('types').apply(f).values
print (m)
[False False False  True False False False False False False]

#changed column name for compare
df['status_2_new'] = df['status'].mask(m, 0)
print (df)
   actions disruptions  status  status_2 types  status_2_new
0        0           N       0         0     A             0
1        0           N       0         0     A             0
2        1           Y       0         0     A             0
3        0           N       1         0     A             0
4        0           N       1         1     A             1
5        0           N       0         0     B             0
6        0           N       0         0     B             0
7        1           N       0         0     B             0
8        0           N       1         1     B             1
9        0           N       1         1     B             1