为了账号安全,请及时绑定邮箱和手机立即绑定

Python:如何标记此数据集

Python:如何标记此数据集

哆啦的时光机 2022-12-20 16:33:26
我有这样的 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 中执行此操作?预期结果:
查看完整描述

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


查看完整回答
反对 回复 2022-12-20
?
弑天下

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


查看完整回答
反对 回复 2022-12-20
?
德玛西亚99

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


查看完整回答
反对 回复 2022-12-20
?
MMMHUHU

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


查看完整回答
反对 回复 2022-12-20
  • 4 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信