繁体   English   中英

检查熊猫数据框中的下一个索引列值和相同值的连续长度

[英]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

结果:

  • 第 a 行有两个连续的 0 值,因此长度为 2
  • 行 b 有三个连续的 0 值,所以长度是 3
  • 行 c 没有连续的 0 值,因此长度为 1
  • 第 d 行没有 0 值,因此长度为 0


此外,如果第一个索引从 0 开始,则在值 1 出现之前不要计数,并从下一个 0 开始计算长度。

  • 应用此条件,行 b 的结果应为 2。

实际数据中有超过 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM