簡體   English   中英

按 ID 分組並對一列的值應用條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM