如何在 Pandas 中按分组标记首个满足条件的行
技术百科
聖光之護
发布时间:2026-01-12
浏览: 次 本文介绍如何使用 pandas 高效识别并标记每个分组中首次出现指定字符(如 `'y'`)所在行的对应日期,适用于客户行为分析、事件首触点追踪等场景。
在数据分析中,常需定位每个用户(或类别)首次满足某条件的记录,例如:每位客户第一次回复“Y”的日期。Pandas 提供了简洁而强大的向量化方法,无需循环或 apply,即可高效实现该目标。
核心思路分为三步:
- 构造布尔条件:筛选出 Y/N 列值为 'Y' 的行;
- 分组内累计计数:对每组 CUS_NAME,在满足 'Y' 的行上进行 cumsum(),得到每个 'Y' 在其组内的序号(1 表示首次,2 表示第二次……);
- 精准标记首行:仅当同时满足“是 'Y'”且“是该组第 1 个 'Y'”时,才填充 BAS_DT,否则设为 NaN。
以下是完整实现代码:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'BAS_DT': ['2025-01-02', '2025-01-03', '2025-01-04', '2025-01-02', '2025-01-03'],
'CUS_NAME': ['A', 'A', 'A', 'B', 'B'],
'Y/N': ['Y', 'Y', 'Y', 'N', 'Y'],
'cum_count': [1, 2, 3, 1, 2]
})
# 步骤 1:标识所有 'Y' 行
cond = df['Y/N'].eq('Y')
# 步骤 2:按 CUS_NAME 分组,对 cond 进行 cumsum → 得到每组内 'Y' 的累计序号
cond1 = cond.groupby(df['CUS_NAME']).cumsum().eq(1) # 仅保留每组第一个 'Y'
# 步骤 3:用 where() 实现条件赋值 —— 满足 cond & cond1 时取 BAS_DT,否则 NaN
df['occur_date'] = df['BAS_DT'].where(cond & cond1)
print(df)✅ 输出结果与预期完全一致:
BAS_DT CUS_NAME Y/N cum_count occur_date 0 2025-01-02 A Y 1 2025-01-02 1 2025-01-03 A Y 2 NaN 2 2025-01-04 A Y 3 NaN 3 2025-01-02 B N 1 NaN 4 2025-01-03 B Y 2 2025-01-03
? 注意事项与扩展提示:
- where() 是安全的向量化赋值方式,比 np.where() 更直观,且天然支持 NaN 填充;
- 若需获取全局首个 'Y'(不按组),可直接使用 df.loc[df['Y/N'].eq('Y').idxmax(), 'BAS_DT'];
- 若数据中存在缺失值(NaN)于 Y/N 列,建议先用 dropna(subset=['Y/N']) 或显式处理,避免 eq('Y') 返回 False 导致误判;
- 该方法时间复杂度为 O(n),远优于 groupby().apply(lambda x: x[x['Y/N']=='Y'].iloc[0]) 等低效方案。
掌握这一模式后,你可轻松迁移至其他场景:如标记每个产品的首次销售日、每位员工的首次打卡时间、每笔订单的首次支付成功时刻等——只需替换列名与条件即可复用。
# 数据分析
# 这一
# 第一个
# 适用于
# 只需
# 首次
# 可直接
# app
# 设为
# 循环
# 事件
# Lambda
# 布尔
# pandas
# 你可
# 每组
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++怎么处理多线程死锁_c++ lock_gua
- Windows 10自带杀毒软件在哪_Window
- Python类装饰器使用_元编程解析【教程】
- Python字符串处理进阶_切片方法解析【指导】
- Win10如何备份注册表_Win10注册表备份步骤
- windows 10应用商店区域怎么改_windo
- 如何诊断并终止卡死的 multiprocessin
- c++的static关键字有什么用 静态变量和静态
- c++中如何使用auto关键字_c++11类型推导
- 如何使用Golang编写单元测试_创建Test函数
- php删除数据怎么软删除_添加is_del字段标记
- C++ STL算法库怎么用?C++常用算法函数(s
- Win11怎么关闭键盘按键音_Win11禁用打字声
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 如何使用Golang搭建本地API测试环境_快速验
- XML的“混合内容”是什么 怎么用DTD或XSD定
- Win10如何更改网络连接_Windows10以太
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- 如何在Golang中实现RPC异步返回_Golan
- Drupal 中 HTML 链接被重复转义导致渲染
- Win10怎样清理C盘爱奇艺缓存_Win10清理爱
- Win11怎么关闭专注助手 Win11关闭免打扰模
- Win11任务栏怎么固定应用 Win11将软件图标
- Win10怎么卸载迅雷_Win10彻底卸载迅雷方法
- Python 中将 ISO 8601 时间戳转换为
- Mac如何解压zip和rar文件?(推荐免费工具)
- C++如何获取CPU核心数?(std::threa
- Python异步编程高级项目教程_asyncio协
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- php下载安装包怎么选_threadsafe与nt
- c++中的Tag Dispatching是什么_c
- C++中的constexpr和const有什么区别
- Win11怎么压缩文件 Win11自带压缩解压功能
- 如何使用Golang读取日志文件_Golang b
- Win11怎么设置任务栏透明_Windows11使
- 如何在 Go 结构体中正确初始化 map 字段
- Golang如何测试HTTP中间件_Golang
- Drupal 中渲染节点时出现 HTML 标签嵌套
- Win11怎么查看显卡显存_查询Win11显卡详细
- 作用域操作符会影响性能吗_php静态调用性能分析【
- 如何在Golang中捕获JSON序列化错误_Gol
- 零基础学会Python自动化办公_高效处理Exce
- Win11怎么设置快速访问_Windows11文件
- 微信里的php文件怎么变mp4_微信接收php转m
- 如何处理“XML格式不正确”错误 常见XML we
- 如何有效拦截拼接式恶意域名的垃圾信息
- Win11怎么设置虚拟内存_Windows 11优
- Mac上的iMovie如何剪辑视频?(新手入门教程
- Windows10怎么查看系统激活状态_Windo
- c++怎么调用nana库开发GUI_c++ 现代风

04 A Y 3 NaN
3 2025-01-02 B N 1 NaN
4 2025-01-03 B Y 2 2025-01-03
QQ客服