亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號