我正在寻找 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 中做同样的事情,我完全被难住了
最佳答案
使用groupby
与 size
按 user
、usage
和 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/