如何用Pandas统计列值跨双阈值的分组切换次数
解决方案
问题回顾
给定如下Pandas DataFrame:
account1 account2 account3 account4 0 4.730500 18.899000 5.926950 3.548100 1 3.922000 11.609333 4.405667 5.333333 2 5.172667 12.932667 4.772167 5.500000 3 4.429833 10.694667 4.859500 8.36100 4 5.149167 13.496667 8.451045 5.166667 5 2.598000 10.655500 5.952333 4.833333 6 5.805167 15.418000 5.296167 4.450000 7 4.168833 9.624833 5.436333 4.403333 8 4.452750 14.699750 4.757250 4.896000
需要按阈值4和7划分三个分组(低于4、4-7之间、高于7),统计每列中连续行跨分组切换的次数,期望输出:
account1 account2 account3 account4 0 4 0 2 3
优雅实现代码
无需显式转换分组值,直接利用布尔判断和Pandas向量化操作完成统计:
import pandas as pd # 构造示例DataFrame data = { 'account1': [4.7305, 3.922, 5.172667, 4.429833, 5.149167, 2.598, 5.805167, 4.168833, 4.45275], 'account2': [18.899, 11.609333, 12.932667, 10.694667, 13.496667, 10.6555, 15.418, 9.624833, 14.69975], 'account3': [5.92695, 4.405667, 4.772167, 4.8595, 8.451045, 5.952333, 5.296167, 5.436333, 4.75725], 'account4': [3.5481, 5.333333, 5.5, 8.361, 5.166667, 4.833333, 4.45, 4.403333, 4.896] } df = pd.DataFrame(data) # 统计每列的分组切换次数 switch_counts = df.apply(lambda col: ((col < 4) != (col.shift() < 4)) | ((col > 7) != (col.shift() > 7)) ).sum().to_frame().T print(switch_counts)
原理说明
- 分组逻辑映射:通过两个布尔判断
col <4和col >7即可唯一确定每个值的分组:col <4为True → 低于4组col >7为True → 高于7组- 两者均为False → 4-7组
- 切换判断:当连续两行的分组发生变化时,要么
col <4的结果改变,要么col >7的结果改变(或两者同时改变),用|(逻辑或)捕捉所有切换场景 - 统计次数:对每列的布尔序列求和,每个
True对应一次分组切换,最终转成单行DataFrame匹配期望格式
内容的提问来源于stack exchange,提问作者CK_42
相关产品推荐
相关产品推荐

