4 回答
TA贡献1816条经验 获得超6个赞
IIUC 并假设只有在至少有一个值YES时才应该设置它,而不是在它之前:IOU IOU
m = (df.Category.eq('IOU').view('i1')
.groupby(df.CaseNo)
.transform(lambda x: x.diff().eq(1).any()))
df['Label'] = m.map({True:'Yes',False:'No'})
print(df)
CaseNo Category Label
0 1 A Yes
1 1 A Yes
2 1 IOU Yes
3 1 A Yes
4 2 B No
5 2 B No
6 3 IOU No
7 3 IOU No
8 3 IOU No
9 4 C Yes
10 4 IOU Yes
这里的想法是Series.diff(),当有一个 1 ( IOU) 前面有一个0(no IOU)时,它将是 1
TA贡献1818条经验 获得超8个赞
Groupby计数IOU是解决它的一种方法:
res = (df
.assign(val = df.groupby('CaseNo').Category.transform(",".join),
label = lambda x: np.where(x.val.str.count("IOU").eq(1) ,"YES","NO")
)
.drop('val',axis=1)
)
res
CaseNo Category label
0 1 A YES
1 1 A YES
2 1 IOU YES
3 1 A YES
4 2 B NO
5 2 B NO
6 3 IOU NO
7 3 IOU NO
8 3 IOU NO
9 4 C YES
10 4 IOU YES
TA贡献1770条经验 获得超3个赞
让我们尝试transform和firstany
g=df.Category.eq('IOU').groupby(df['CaseNo'])
m=g.transform('any') & ~g.transform('first')
df['New']=m.map({True:'Yes',False:'No'})
df
Out[24]:
CaseNo Category New
0 1 A Yes
1 1 A Yes
2 1 IOU Yes
3 1 A Yes
4 2 B No
5 2 B No
6 3 IOU No
7 3 IOU No
8 3 IOU No
9 4 C Yes
10 4 IOU Yes
TA贡献1834条经验 获得超8个赞
以下代码可以满足您的需求。它使用groupby和index。优点是您可以随时修改功能func以根据需要进行更新。其他答案无疑是具体的,但不能修改太多。
def func(x):
try:
return 'YES' if x.index('IOU')!=0 else 'NO'
except:
return "NO"
mapper = df.groupby("CaseNo")['Category'].agg(list).apply(func)
df['Label'] = df['CaseNo'].apply(lambda x: mapper[x])
print(df)
输出:
CaseNo Category Label
0 1 A YES
1 1 A YES
2 1 IOU YES
3 1 A YES
4 2 B NO
5 2 B NO
6 3 IOU NO
7 3 IOU NO
8 3 IOU NO
9 4 C YES
10 4 IOU YES
添加回答
举报