我写了一个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]类型的标量进行比较。
有人可以指出我在这里做错了吗?
答案 0 :(得分:1)
我认为您需要按groupby
创建模板,然后按values
转换为numpy array
,然后使用Series.mask
,True
值得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