[英]Group by ID and apply a condition on the value of one column
我是 pandas 庫的新手,非常感謝您的幫助。 這是我的輸入
ID | 日期 | LABEL | 股票 |
---|---|---|---|
AA | 2020 年 1 月 26 日 | 真的 | 100 |
AA | 2020 年 1 月 27 日 | 錯誤的 | 200 |
BB | 2020 年 1 月 28 日 | 錯誤的 | 300 |
BB | 2020 年 1 月 29 日 | 真的 | 500 |
BB | 2020 年 1 月 30 日 | 錯誤的 | 100 |
抄送 | 2020 年 1 月 26 日 | 真的 | 200 |
抄送 | 2020 年 1 月 27 日 | 錯誤的 | 300 |
抄送 | 2020 年 1 月 28 日 | 錯誤的 | 100 |
抄送 | 2020 年 1 月 29 日 | 真的 | 400 |
我想查看 Label 列以及為每個 ID 找到的第一個“TRUE” label,我需要將庫存值復制到新列中。 如果一個 ID 有多個 TRUE,我只需要考慮第一個。
這是我想要獲得的 output:
ID | 日期 | LABEL | 股票 | 新的 |
---|---|---|---|---|
AA | 2020 年 1 月 26 日 | 真的 | 100 | 100 |
AA | 2020 年 1 月 27 日 | 錯誤的 | 200 | |
BB | 2020 年 1 月 28 日 | 錯誤的 | 300 | |
BB | 2020 年 1 月 29 日 | 真的 | 500 | 500 |
BB | 2020 年 1 月 30 日 | 錯誤的 | 100 | |
抄送 | 2020 年 1 月 26 日 | 真的 | 200 | 200 |
抄送 | 2020 年 1 月 27 日 | 錯誤的 | 300 | |
抄送 | 2020 年 1 月 28 日 | 錯誤的 | 100 | |
抄送 | 2020 年 1 月 29 日 | 真的 | 400 |
謝謝您的幫助!
使用帶有.duplicated()
的雙 boolean
df.loc[df['LABEL'].eq(True) &
df.duplicated(subset=['ID'],keep='last'),'NEW'] = df['STOCK']
print(df.fillna(''))
ID DATE LABEL STOCK NEW
0 AA 01/26/2020 True 100 100
1 AA 01/27/2020 False 200
2 BB 01/28/2020 False 300
3 BB 01/29/2020 True 500 500
4 BB 01/30/2020 False 100
5 CC 01/26/2020 True 200 200
6 CC 01/27/2020 False 300
7 CC 01/28/2020 False 100
8 CC 01/29/2020 True 400
查看每個 boolean,我們只想要兩者都為真的值。
df.assign(ky1=df['LABEL'].eq(True),
ky2=df.duplicated(subset=['ID'],keep='last')
)
ID DATE LABEL STOCK NEW ky1 ky2
0 AA 01/26/2020 True 100 100.0 True True
1 AA 01/27/2020 False 200 NaN False False
2 BB 01/28/2020 False 300 NaN False True
3 BB 01/29/2020 True 500 500.0 True True
4 BB 01/30/2020 False 100 NaN False False
5 CC 01/26/2020 True 200 200.0 True True
6 CC 01/27/2020 False 300 NaN False True
7 CC 01/28/2020 False 100 NaN False True
8 CC 01/29/2020 True 400 NaN True False
另一個版本,使用.groupby()
:
m = df.index.isin(
df[df["LABEL"] == True].reset_index().groupby("ID").index.first()
)
df.loc[m, "NEW"] = df.loc[m, "STOCK"]
print(df)
印刷:
ID DATE LABEL STOCK NEW
0 AA 01/26/2020 True 100 100.0
1 AA 01/27/2020 False 200 NaN
2 BB 01/28/2020 False 300 NaN
3 BB 01/29/2020 True 500 500.0
4 BB 01/30/2020 False 100 NaN
5 CC 01/26/2020 True 200 200.0
6 CC 01/27/2020 False 300 NaN
7 CC 01/28/2020 False 100 NaN
8 CC 01/29/2020 True 400 NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.