python - 为数据框中的每个用户查找最长的连续零运行
问题描述
我正在寻找数据帧中连续零的最大运行,结果按用户分组。我有兴趣在使用情况下运行 RLE。
样本输入:
用户--天--使用
A-----1-----0
A-----2--------0
A-----3------1
B --1--------0
B-----2-----1
B-----3--------0
期望的输出
用户---longest_run
a - - - - 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
with size
by columnsuser
和 usage
helperSeries
首先用于连续值:
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
然后只过滤zero
行,获取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
推荐阅读
- npgsql - 使用 SqlKata 保存和检索 JSONB 列
- python-3.x - 如何动态创建kafka生产者
- javascript - [i] 的替代项是什么,相当于“全部”?
- java - Android Studio 线性布局定位不起作用?
- javascript - 我想让codeigniter中的输入数量相等
- django - 授权标头在来自浏览器的 put 请求中被剥离,但在 Postman 中工作正常
- r - 如何在R中找到最常见的组合
- sql - Oracle SQL group by then sum
- node.js - 在填充模型时出现错误 Schema还没有为模型“Task”注册。\n使用 mongoose.model(name, schema)
- linux - How to install kubernetes using kubeadm on a host walready running docker multi container application