想法是为连续计数0 创建df1 并为new1 获取maximum 值。其次它更复杂 - 获取第一个最大值的索引(这里是最大值1,所以获取第一个1的索引)并通过掩码为设置0值创建掩码,所以接下来sum首先省略仅限0 组。
另外,如果只有0 行返回错误的输出,所以需要用多个~a.all(axis=1).values[:, None] 更改条件以防止它:
a = df == 0
b = a.cumsum(axis=1)
df1 = (b-b.where(~a, axis=1).ffill(axis=1).fillna(0).astype(int))
cols = np.arange(len(df.columns))
n = np.argmax(df.values, axis=1)[:, None]
mask = (cols > n) * ~a.all(axis=1).values[:, None]
df['new1'] = df1.max(axis=1)
df['new2'] = df1.where(mask, 0).max(axis=1)
print (df)
1 2 3 4 5 6 new1 new2
a 1 0 0 1 1 1 2 2
b 0 0 0 1 0 0 3 2
c 1 0 1 0 1 0 1 1
d 1 1 1 1 1 1 0 0
详情:
print (df1)
1 2 3 4 5 6
a 0 1 2 0 0 0
b 1 2 3 0 1 2
c 0 1 0 1 0 1
d 0 0 0 0 0 0
print (df1.where(mask, 0))
1 2 3 4 5 6
a 0 1 2 0 0 0
b 0 0 0 0 1 2
c 0 1 0 1 0 1
d 0 0 0 0 0 0
仅使用 0 行验证解决方案:
print (df)
1 2 3 4 5 6
a 1 0 0 1 1 1
b 0 0 0 0 0 0 <- only 0 row
c 1 0 1 0 1 0
d 1 1 1 1 1 1
a = df == 0
b = a.cumsum(axis=1)
df1 = (b-b.where(~a, axis=1).ffill(axis=1).fillna(0).astype(int))
cols = np.arange(len(df.columns))
n = np.argmax(df.values, axis=1)[:, None]
print (df1)
1 2 3 4 5 6
a 0 1 2 0 0 0
b 1 2 3 4 5 6 <- count all 0
c 0 1 0 1 0 1
d 0 0 0 0 0 0
print (df1.where(mask, 0))
1 2 3 4 5 6
a 0 1 2 0 0 0
b 0 0 0 0 0 0 <- correct not count this row
c 0 1 0 1 0 1
d 0 0 0 0 0 0