![](/img/trans.png)
[英]Groupby with boolean condition True in one of the columns in Pandas
[英]PANDAS groupby 2 columns with condition
我有一個數據框,我需要按 2 列分組並根據條件創建一個新列。 我的數據如下所示:
ID | 星期 | day_num |
---|---|---|
1個 | 1個 | 2個 |
1個 | 1個 | 3個 |
1個 | 2個 | 4個 |
1個 | 2個 | 1個 |
2個 | 1個 | 1個 |
2個 | 2個 | 2個 |
3個 | 1個 | 4個 |
我需要按列 ID 和周進行分組,因此每周每個 ID 都有一行。 groupby 是基於條件的——如果某周某個 ID 在 day_num 列中的值為 1,則該值在 groupby 下將為 1,否則為 0。例如,ID 1 在兩行下都有 2 和 3,因此它等於 0 groupby,對於第 2 周 ID 1,它有一行值為 1,因此為 1。
我需要的 output 如下所示:
ID | 星期 | 第一天 |
---|---|---|
1個 | 1個 | 0 |
1個 | 2個 | 1個 |
2個 | 1個 | 1個 |
2個 | 2個 | 0 |
3個 | 1個 | 0 |
我搜索並找到了這段代碼,但是它使用了計數,我只需要在其中寫入值 1 或 0 即可。
df1=df1.groupby('ID','week')['day_num'].apply(lambda x: (x=='1').count())
有沒有辦法做到這一點?
謝謝!
您可以從另一種方式進行處理:在“day_num”中檢查是否與 1 相等,然后按 ID 和周對其進行分組。 然后與any
聚合以查看組中是否有任何 1。 最后將 True/Falses 轉換為 1/0 並將石斑魚移至列。
df["day_num"].eq(1).groupby([df["ID"], df["week"]]).any().astype(int).reset_index()
ID week day_num
0 1 1 0
1 1 2 1
2 2 1 1
3 2 2 0
4 3 1 0
import pandas as pd
src = pd.DataFrame({'ID': [1, 1, 1, 1, 2, 2, 3],
'week': [1, 1, 2, 2, 1, 2, 1],
'day_num': [2, 3, 4, 1, 1, 2, 4],
})
src['day_num'] = (~(src['day_num']-1).astype(bool)).astype(int)
r = src.sort_values(by=['day_num']).drop_duplicates(['ID', 'week'], keep='last').sort_index().reset_index(drop=True)
print(r)
結果
ID week day_num
0 1 1 0
1 1 2 1
2 2 1 1
3 2 2 0
4 3 1 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.