[英]How to check if next 3 consecutive rows in pandas column have same value?
[英]Check the next index column value and consecutive length of same value in pandas dataframe
我想检查下一个索引列是否与前一个索引列具有相同的值,并获得连续相同的值长度。
比如下面有一个dataframe,我想获取连续值为0的长度。
1 2 3 4 5 6
a 1 0 0 1 1 1
b 0 0 0 1 0 0
c 1 0 1 0 1 0
d 1 1 1 1 1 1
结果:
此外,如果第一个索引从 0 开始,则在值 1 出现之前不要计数,并从下一个 0 开始计算长度。
实际数据中有超过 1000000 行,所以 for 循环会花费太长时间,所以我想知道是否有办法在 Pandas 或其他方式中做到这一点。
想法是为计数连续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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.