首页 > 解决方案 > 根据计数熊猫的条件按计数分组

问题描述

所以假设我有一个看起来像这样的df:


    df = pd.DataFrame({'Data1' : ['A', 'A', 'A', 'B', 'B', 'B'], 
                       'Data2' : [100, 100, 200, 100, 100, 100],
                       'Data3' : [1, 2, 3, 1, 1, 1],
                       'State' : ['On', 'On', 'Off', 'Off', 'On', 'On']})
+-------+-------+-------+-------+
| Data1 | Data2 | Data3 | State |
+-------+-------+-------+-------+
| A     |   100 |     1 | On    |
| A     |   100 |     2 | On    |
| A     |   200 |     3 | Off   |
| B     |   100 |     1 | Off   |
| B     |   100 |     1 | On    |
| B     |   100 |     1 | On    |
+-------+-------+-------+-------+

我想对 Data1、Data2 做一个 groupby,然后对 Data3 做一个独特的计数,但只计算 State 值为“On”的那个。

所以我的结果看起来像这样:

+-------+-------+-------+-------+-------+
| Data1 | Data2 | Data3 | State | Count |
+-------+-------+-------+-------+-------+
| A     |   100 |     1 | On    |     2 |
| A     |   100 |     2 | On    |     2 |
| A     |   200 |     3 | Off   |     0 |
| B     |   100 |     1 | Off   |     1 |
| B     |   100 |     1 | On    |     1 |
| B     |   100 |     1 | On    |     1 |
+-------+-------+-------+-------+-------+

这是我所知道的错误,因为它按状态分组,但我不确定如何使其仅按 Data1 和 Data2 分组,同时仅在 State = 'On' 关闭时进行计数。

df['Count'] = df.groupby(['Data1', 'Data2', 'State'])['Data3'].transform('nunique')

任何和所有的帮助都表示赞赏!

标签: pythonpandasdataframe

解决方案


你也可以做一个布尔掩码,groupby.nunique后跟左合并:

cols = ['Data1','Data2']
m = df[df['State'].eq("On")].groupby(cols)['Data3'].nunique()
out = (df.merge(m,left_on=cols,right_index=True,how='left',suffixes=('','_counts'))
       .fillna({"Data3_counts":0}))

print(out)

  Data1  Data2  Data3 State  Data3_counts
0     A    100      1    On           2.0
1     A    100      2    On           2.0
2     A    200      3   Off           0.0
3     B    100      1   Off           1.0
4     B    100      1    On           1.0
5     B    100      1    On           1.0

推荐阅读