gpt4 book ai didi

python - Pandas 分组行值调整

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:55 25 4
gpt4 key购买 nike

我编写了一个 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。否则等于“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] 的标量进行比较。

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

最佳答案

我认为你需要通过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

关于python - Pandas 分组行值调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45193871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com