Python 返回计数为1';s前面的0';每个组的s和组内的每个零

Python 返回计数为1';s前面的0';每个组的s和组内的每个零,python,pandas,dataframe,Python,Pandas,Dataframe,我处理一个大数据文件(1000万行),下面是我现在关心的两列: | id | v1 | | 101 | 0 | | 101 | 0 | | 101 | 1 | | 101 | 0 | | 101 | 1 | | 101 | 1 | | 101

我处理一个大数据文件(1000万行),下面是我现在关心的两列:

|    id    |       v1       |
| 101      | 0              |
| 101      | 0              |
| 101      | 1              |
| 101      | 0              |
| 101      | 1              |
| 101      | 1              |
| 101      | 0              |
| 101      | 1              |
| 97       | 0              |
| 97       | 1              |
| 97       | 1              |
| 97       | 0              |
| 97       | 0              |
| 13       | 1              | 
| 13       | 1              |
| 13       | 0              |
| 13       | 1              |
| 13       | 0              |
| 13       | 1              |
| 13       | 1              |
| 13       | 1              |
| 13       | 1              |
| 13       | 0              |
| 2076     | 0              |
| 2076     | 0              |
| 2076     | 0              |

我想创建一个列(大小较小),其中包含每个
id
v1
列中每个
0
前面的
1
。例如,
id=101
的结果如下:

now专栏 0 0 1. 2.
下面的目标是创建组,您可以通过将所有
0
和前面的
1
值分组为一个“子组”,并取
size()-1
(减去1减去每个子组中每个零的计数):


2不应该是3吗?您还可以添加完整的预期输出吗?@DaniMesejo我想他们只想计算当前0之前发生的1,但仅在前一个0之后发生的1(即0之间的1)。这是一个很好的问题,欢迎使用StackOverflow!如果最佳答案已解决您的问题,请单击答案旁边的复选标记()。节日快乐@DaniMesejo,不,只有在前一个零之后的那些。。就像下面David Erickson的输出一样,谢谢,这是一个优雅的答案,当我试图将其作为函数编写时,遇到了一个问题(这会使我产生oom错误),但它在其他情况下工作。
z = df1['v1'].eq(0) # return True for values equal to 0

# if True return cumulative sum, else nan
df1['subgroup'] = np.where(z, z.cumsum(), np.nan) 

# backfill what is essentially the "subgroup" for `0` values to `1` values that belong with each subgroup.
df1['subgroup'] = df1.groupby('id')['subgroup'].bfill()

# groupby id and subgroup, get the size of the group, subtract 1 and drop the subgroup from output with droplevel(1) since 2nd column of index
df1 = (df1.groupby(['id', 'subgroup'], sort=False).size() - 1).droplevel(1)

df1

Out[1]: 
id
101     0
101     0
101     1
101     2
97      0
97      2
97      0
13      2
13      1
13      4
2076    0
2076    0
2076    0
dtype: int64