嗨,我有这样的df:
df = pd.DataFrame({'CaseNo':[1,1,1,1,2,2,3,3,3,4,4],
'Category':['A','A','IOU','A','B','B','IOU','IOU','IOU','C','IOU']})

我想根据这个条件给CaseNo标签:
对于每个CaseNo,如果在Category列中出现了值'IOU‘,其中任何值(’IOU‘除外)出现在 it之前--则标记为’是‘,否则标记为’否‘。
我如何在Python中做到这一点?预期成果:

发布于 2020-06-02 15:38:13
,并假设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这里的想法是,当有一个1 ( Series.diff() )前面有一个0 (无IOU)时,0将是1。
发布于 2020-06-02 15:33:21
让我们试试transform和first和any
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发布于 2020-06-02 15:37:57
下面的代码可以满足您的需要。它使用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 YEShttps://stackoverflow.com/questions/62155497
复制相似问题