猿问

Python:如何标记此数据集

我有这样的 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根据以下条件标记 col:
对于每个CaseNo,如果在列中出现值“IOU”且前面Category有任何值(“IOU”除外)- 标记“YES”,否则标记“NO”。

我如何在 Python 中执行此操作?预期结果:

http://img4.mukewang.com/63a17378000171f003980638.jpg

哆啦的时光机
浏览 142回答 4
4回答

潇湘沐

IIUC 并假设只有在至少有一个值YES时才应该设置它,而不是在它之前:IOU IOUm = (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 Label0        1        A   Yes1        1        A   Yes2        1      IOU   Yes3        1        A   Yes4        2        B    No5        2        B    No6        3      IOU    No7        3      IOU    No8        3      IOU    No9        4        C   Yes10       4      IOU   Yes这里的想法是Series.diff(),当有一个 1 ( IOU) 前面有一个0(no IOU)时,它将是 1

弑天下

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    label0      1       A        YES1      1       A        YES2      1      IOU       YES3      1       A        YES4      2       B        NO5      2       B        NO6      3     IOU        NO7      3     IOU        NO8      3     IOU        NO9      4       C        YES10     4     IOU        YES

德玛西亚99

让我们尝试transform和firstanyg=df.Category.eq('IOU').groupby(df['CaseNo'])m=g.transform('any') & ~g.transform('first')df['New']=m.map({True:'Yes',False:'No'})dfOut[24]:     CaseNo Category  New0        1        A  Yes1        1        A  Yes2        1      IOU  Yes3        1        A  Yes4        2        B   No5        2        B   No6        3      IOU   No7        3      IOU   No8        3      IOU   No9        4        C  Yes10       4      IOU  Yes

MMMHUHU

以下代码可以满足您的需求。它使用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 Label0        1        A   YES1        1        A   YES2        1      IOU   YES3        1        A   YES4        2        B    NO5        2        B    NO6        3      IOU    NO7        3      IOU    NO8        3      IOU    NO9        4        C   YES10       4      IOU   YES
随时随地看视频慕课网APP

相关分类

Python
我要回答