首页 > 解决方案 > Python - 对组内的条件运行计数

问题描述

我有以下数据框:

data = pd.DataFrame({
'ID': ['A','A','A','B','B','C','C','C','C','C','D','E','E','F'], 
'Button': ['Begin','Begin','End','Begin','End','Begin','End','Begin','Begin','End','Begin','Begin','End','End']
}) 

通过唯一的“ID”,我想通过运行计数将行组合在一起,直到字符串“End”出现在 Button 列中。例如,分配给 ID = 'C' 的 5 行应分成两组(1 和 2),因为有两行包含 'End'。ID = 'D' 不应分组,因为没有使用字符串 'End' 分配给 Id = 'D' 的行。

result = pd.DataFrame({
'ID': ['A','A','A','B','B','C','C','C','C','C','D','E','E','F'], 
'Button': ['Begin','Begin','End','Begin','End','Begin','End','Begin','Begin','End','Begin','Begin','End','End'],
'Count': [1,1,1,1,1,1,1,2,2,2,0,1,1,1]
})

我该怎么办?

标签: pythoncount

解决方案


IIUC,我们可以首先将每个“结束”设为 1,将其他所有内容设为 NaN。然后对于每个 ID 组,我们可以取累积和(计算 Ends)并回填以将所有 Begins 设置为适当的数字。最后,我们可以用 0 填充任何剩余的 NaN,因为它们是组中没有任何 End 的情况。

爱荷华州:

In [263]: ends = (data["Button"] == "End").replace(False, np.nan)

In [264]: data["Count"] = ends.groupby(data["ID"]).apply(
          lambda x: x.cumsum().bfill()).fillna(0).astype(int)

In [265]: data
Out[265]: 
   ID Button  Count
0   A  Begin      1
1   A  Begin      1
2   A    End      1
3   B  Begin      1
4   B    End      1
5   C  Begin      1
6   C    End      1
7   C  Begin      2
8   C  Begin      2
9   C    End      2
10  D  Begin      0
11  E  Begin      1
12  E    End      1
13  F    End      1

推荐阅读