Python 返回计数为1';s前面的0';每个组的s和组内的每个零
我处理一个大数据文件(1000万行),下面是我现在关心的两列: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
| 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