分组行值调整

2024-05-23 19:58:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个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”列转换为“status 2”。逻辑是:在同一个“types”组中,如果“action”标记为1,而“disruptions”标记为“Y”,则“status_2”的下一行将为0。否则等于“状态”。你知道吗

以下是我所拥有的:

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]类型的标量进行比较。你知道吗

有人能指出我做错了什么吗?你知道吗


Tags: 数据lambda函数标记actions目标dataframedf
1条回答
网友
1楼 · 发布于 2024-05-23 19:58:47

我认为您需要通过groupby创建mask,通过^{}转换为numpy array,然后使用^{},对于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

相关问题 更多 >