python - 如何计算 DataFrame 中连续 TRUE 的数量?
问题描述
我有一个由 True 和 False 组成的数据集。
Sample Table:
A B C
0 False True False
1 False False False
2 True True False
3 True True True
4 False True False
5 True True True
6 True False False
7 True False True
8 False True True
9 True False False
我想计算每一列的连续 True 值的数量,如果有多个连续的 True 系列,我想得到它的最大值。
对于上表,我会得到:
length = [3, 4, 2]
我发现了类似的线程,但没有一个能解决我的问题。
由于我这样做并且将拥有更多列(产品),因此无论列名如何,我都需要为整个表执行此操作,并获得一个数组作为结果。
如果可能的话,我想了解最长序列的第一个真的索引,也就是这个最长的真系列开始的地方,所以结果就是这个:
index = [5, 2, 7]
解决方案
True
解决方案应该简化,如果每列总是至少一个:
b = df.cumsum()
c = b.sub(b.mask(df).ffill().fillna(0)).astype(int)
print (c)
A B C
0 0 1 0
1 0 0 0
2 1 1 0
3 2 2 1
4 0 3 0
5 1 4 1
6 2 0 0
7 3 0 1
8 0 1 2
9 1 0 0
#get maximal value of all columns
length = c.max().tolist()
print (length)
[3, 4, 2]
#get indexes by maximal value, subtract length and add 1
index = c.idxmax().sub(length).add(1).tolist()
print (index)
[5, 2, 7]
详情:
print (pd.concat([b,
b.mask(df),
b.mask(df).ffill(),
b.mask(df).ffill().fillna(0),
b.sub(b.mask(df).ffill().fillna(0)).astype(int)
], axis=1,
keys=('cumsum', 'mask', 'ffill', 'fillna','sub')))
cumsum mask ffill fillna sub
A B C A B C A B C A B C A B C
0 0 1 0 0.0 NaN 0.0 0.0 NaN 0.0 0.0 0.0 0.0 0 1 0
1 0 1 0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0 0 0
2 1 2 0 NaN NaN 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1 1 0
3 2 3 1 NaN NaN NaN 0.0 1.0 0.0 0.0 1.0 0.0 2 2 1
4 2 4 1 2.0 NaN 1.0 2.0 1.0 1.0 2.0 1.0 1.0 0 3 0
5 3 5 2 NaN NaN NaN 2.0 1.0 1.0 2.0 1.0 1.0 1 4 1
6 4 5 2 NaN 5.0 2.0 2.0 5.0 2.0 2.0 5.0 2.0 2 0 0
7 5 5 3 NaN 5.0 NaN 2.0 5.0 2.0 2.0 5.0 2.0 3 0 1
8 5 6 4 5.0 NaN NaN 5.0 5.0 2.0 5.0 5.0 2.0 0 1 2
9 6 6 4 NaN 6.0 4.0 5.0 6.0 4.0 5.0 6.0 4.0 1 0 0
编辑:
仅使用列的通用解决方案False
- 添加由以下人员numpy.where
创建的布尔掩码DataFrame.any
:
print (df)
A B C
0 False True False
1 False False False
2 True True False
3 True True False
4 False True False
5 True True False
6 True False False
7 True False False
8 False True False
9 True False False
b = df.cumsum()
c = b.sub(b.mask(df).ffill().fillna(0)).astype(int)
mask = df.any()
length = np.where(mask, c.max(), -1).tolist()
print (length)
[3, 4, -1]
index = np.where(mask, c.idxmax().sub(c.max()).add(1), 0).tolist()
print (index)
[5, 2, 0]
推荐阅读
- botframework - Botframework V4 上的 3D Avatar 实现
- deep-learning - 带有浮动标签的神经网络
- django - 使用 AWS/ElasticIP 配置 Django 时遇到问题
- python - 如何根据在 python 上的创建时间列出文件和文件夹?
- asp.net-core - 启用二进制媒体类型会中断 AWS Lambda 中的选项 POST 调用 (CORS)
- sql-server - 查找班级平均人数和每个科目的学生人数
- python - 使用新数据更新 Pandas 数据框,同时保留现有 ID 号
- ios - 向 Swift 库添加对 SwiftPM 的支持
- spring-boot - UsernameNotFoundException 在尝试通过 POSTMAN 发送 POST 请求来尝试用户登录的工作方式时捕获
- python - 从需要在下载前勾选的网站下载文件的推荐方法和 python 库是什么?