簡體   English   中英

只有當pandas中的某列中存在某個值時才會計算Groupby

[英]Groupby count only when a certain value is present in one of the column in pandas

我有一個類似於下面提到的數據庫的數據框:

+------------+-----+--------+ | time | id | status | +------------+-----+--------+ | 1451606400 | id1 | Yes | | 1451606400 | id1 | Yes | | 1456790400 | id2 | No | | 1456790400 | id2 | Yes | | 1456790400 | id2 | No | +------------+-----+--------+

我正在按照上面提到的所有列進行分組,並且我可以使用以下命令成功地在名為'count'的不同列中獲取計數:

df.groupby(['time','id', 'status']).size().reset_index(name='count')

但我希望上述數據框中的計數只在那些status = 'Yes' ,其余應為'0'

期望的輸出:

+------------+-----+--------+---------+ | time | id | status | count | +------------+-----+--------+---------+ | 1451606400 | id1 | Yes | 2 | | 1456790400 | id2 | Yes | 1 | | 1456790400 | id2 | No | 0 | +------------+-----+--------+---------+

我嘗試使用以下代碼計算status = 'Yes'

df[df['status']== 'Yes'].groupby(['time','id','status']).size().reset_index(name='count')

這顯然給了我那些status = 'Yes'行,並丟棄了其余的行。 我想要丟棄的count = 0

有沒有辦法得到結果?

提前致謝!

使用lambda函數和apply和count sum boolena True值如1

df1 = (df.groupby(['time','id','status'])
         .apply(lambda x: (x['status']== 'Yes').sum())
         .reset_index(name='count'))

或者創建新列和sum

df1 = (df.assign(A=df['status']=='Yes')
         .groupby(['time','id','status'])['A']
         .sum()
         .astype(int)
         .reset_index(name='count'))

非常相似的解決方案,沒有新列,但更糟糕的可讀性:

df1 = ((df['status']=='Yes')
        .groupby([df['time'],df['id'],df['status']])
        .sum()
        .astype(int)
        .reset_index(name='count'))

print (df)
         time   id status  count
0  1451606400  id1    Yes      2
1  1456790400  id2     No      0
2  1456790400  id2    Yes      1

如果你不介意稍微不同的輸出格式,你可以pd.crosstab

df = pd.DataFrame({'time': [1451606400]*2 + [1456790400]*3,
                   'id': ['id1']*2 + ['id2']*3,
                   'status': ['Yes', 'Yes', 'No', 'Yes', 'No']})

res = pd.crosstab([df['time'], df['id']], df['status'])

print(res)

status          No  Yes
time       id          
1451606400 id1   0    2
1456790400 id2   2    1

結果是一種更有效的方式來存儲您的數據,因為您不會在每個“是”/“否”類別的單獨行中重復索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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