You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

原理说明

  1. 分组逻辑映射:通过两个布尔判断col <4和col >7即可唯一确定每个值的分组:
    • col <4为True → 低于4组
    • col >7为True → 高于7组
    • 两者均为False → 4-7组
  2. 切换判断:当连续两行的分组发生变化时,要么col <4的结果改变,要么col >7的结果改变(或两者同时改变),用|(逻辑或)捕捉所有切换场景
  3. 统计次数:对每列的布尔序列求和,每个True对应一次分组切换,最终转成单行DataFrame匹配期望格式

内容的提问来源于stack exchange,提问作者CK_42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:27:46