python - 为数据框中的每个用户查找最长的连续零

标签 python binary counting run-length-encoding

我正在寻找 DataFrame 中连续零的最大运行,结果按用户分组。我有兴趣在使用时运行 RLE。

示例输入:

用户--天--使用
A-----1------0
A-----2------0
A-----3-----1
B-----1------0
B-----2-----1
B-----3------0

期望的输出

用户---longest_run
一 - - - - 2
b - - - - 1

mydata <- mydata[order(mydata$user, mydata$day),]
user <- unique(mydata$user)
d2 <- data.frame(matrix(NA, ncol = 2, nrow = length(user)))
names(d2) <- c("user", "longest_no_usage")
d2$user <- user
for (i in user) {
  if (0 %in% mydata$usage[mydata$user == i]) {
    run <- rle(mydata$usage[mydata$user == i]) #Run Length Encoding
    d2$longest_no_usage[d2$user == i] <- max(run$length[run$values == 0])
  } else {
    d2$longest_no_usage[d2$user == i] <- 0 #some users did not have no-usage days
  }
}
d2 <- d2[order(-d2$longest_no_usage),]

这在 R 中有效,但我想在 python 中做同样的事情,我完全被难住了

最佳答案

使用groupbysizeuserusage 和 helper Series 列优先连续值:

print (df)
  user  day  usage
0    A    1      0
1    A    2      0
2    A    3      1
3    B    1      0
4    B    2      1
5    B    3      0
6    C    1      1


df1 = (df.groupby([df['user'], 
                   df['usage'].rename('val'), 
                   df['usage'].ne(df['usage'].shift()).cumsum()])
        .size()
        .to_frame(name='longest_run'))

print (df1)
                longest_run
user val usage             
A    0   1                2
     1   2                1
B    0   3                1
         5                1
     1   4                1
C    1   6                1

然后只过滤 行,获取max 并添加reindex对于附加非 0 组:

df2 = (df1.query('val == 0')
          .max(level=0)
          .reindex(df['user'].unique(), fill_value=0)
          .reset_index())
print (df2)
  user  longest_run
0    A            2
1    B            1
2    C            0

详细信息:

print (df['usage'].ne(df['usage'].shift()).cumsum())
0    1
1    1
2    2
3    3
4    4
5    5
6    6
Name: usage, dtype: int32

关于python - 为数据框中的每个用户查找最长的连续零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51605651/

相关文章:

python - 使用 Google App Engine 设置 Cherrypy

c++ - 如何在 C++ 中对字符串变量应用计数出现次数的概念

perl - 如何在 Perl 中计算二进制统计数据?

python - 是否有对 mySQL 有空间支持的 python 库?

python - Bokeh 滚动图

python - scipy.optimize.curve_fit 产生无意义的曲线拟合

python - 为什么我将四个字节转换为二进制只有 30 个二进制数字?

ios - 从文件 IOS 中读取整数

assembly - 获取字节中特定位的值

c - 如何在不使用strlen的情况下计算字符串的字符数