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
添加回答
舉報