取消累积条码

时间:2019-05-20 03:36:45

标签: python pandas pandas-groupby

我正在尝试创建一个累积条纹的计数,但是可以由其他列取消。此计数有三个结果

  • 条纹基于标志== true积累。
  • 在取消== true时,取消后重置条纹。
  • 条纹没有任何作用,并重复当前条纹。

我尝试了几种不同的方法来尝试组合标志并使用np.where取消,用where,多个累加,填充和ngroup屏蔽groupby,但是无法获得想要的结果。

df = pd.DataFrame(
    {
        "cond1": [True, False, True, False, True, False, True],
        "cond2": [False, False, False, True, False, False, False]
    })

df['flag'] = np.where(df['cond1'], 1, 0)
df['cancel'] = np.where(df['cond2'], 1, 0)

# Combined
df['combined'] = df['flag'] - df['cancel']

# Cumsum only
df['cumsum'] = df['combined'].cumsum()

# Cumcount masked by where
df['cumsum_cumcount'] = df.where(df['cond1']).groupby((df['cond2']).cumsum()).cumcount()

# Cumcount then cumsum
df['cumsum_cumcount_cumsum'] = df.where(df['cancel'] == False).groupby(df['flag'].cumsum()).cumcount().cumsum()

    cond1   cond2   flag    cancel  c2  c3  c1
0   True    False    1         0    0   0   1
1   False   False    0         0    1   1   1
2   True    False    1         0    2   1   2
3   False   True     0         1    0   2   1
4   True    False    1         0    1   2   2
5   False   False    0         0    2   3   2
6   True    False    1         0    3   3   3

    cond1   cond2   streak
0   True    False     1
1   False   False     1
2   True    False     2
3   False   True      0 
4   True    False     1
5   False   False     1 
6   True    False     2     
7   True    False     3
8   False   False     3
9   True    False     4
10  False   True      0
11  False   False     0
12  True    False     1

当前条纹重复出现,在cond1为true时累积,在cond2为false时重置。如果这也可以在相反的方向上积累而没有太多麻烦的话,那么将获得丰厚的积分。取消负号标志为正号。

非常感谢。

1 个答案:

答案 0 :(得分:0)

似乎您需要cumsumcond2创建组密钥,然后cumsumcond1

df.groupby(df.cond2.cumsum()).cond1.cumsum()
Out[155]: 
0     1.0
1     1.0
2     2.0
3     0.0
4     1.0
5     1.0
6     2.0
7     3.0
8     3.0
9     4.0
10    0.0
11    0.0
12    1.0
Name: cond1, dtype: float64