python - 根据计数熊猫的条件按计数分组
问题描述
所以假设我有一个看起来像这样的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')
任何和所有的帮助都表示赞赏!
解决方案
你也可以做一个布尔掩码,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
推荐阅读
- c# - 不确定我在这里缺少什么?C#(30 天代码挑战;条件语句简介)
- design-patterns - TDD 和 DDD 是架构模式还是设计模式?
- memory - 确定给定地址是 4k 还是 8k 对齐
- javascript - 如何使“使用 bitcoinjs-lib 发送交易”工作?
- python - 根据Python中的多个条件将多个数据帧中的一列合并到另一个数据帧
- javascript - JavaScript 中 curl 请求的等价物是什么?
- sql - 具有多列的 Sql Between 子句
- assembly - 在 MIPS 中通过移位和加法进行乘法,无需乘法
- java - 任何人都可以解释构造函数、继承和运行时多态性是如何工作的吗?还要解释以下输出背后的逻辑
- c++ - 如果已经创建了一个 mongocxx::instance 对象,则无法创建该对象