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

如何基于Pandas DataFrame前一行的Status值统计符合条件的姓名数量

解决方案

实现代码

import pandas as pd

# 构造数据集
data = [
    ["John", "2022-11-01", "Yes"],
    ["Jane", "2022-11-01", "No"],
    ["Emily", "2022-11-02", "No"],
    ["John", "2022-11-02", "No"],
    ["Emily", "2022-11-03", "Yes"],
    ["Jane", "2022-11-03", "No"],
    ["Emily", "2022-11-04", "No"],
]

df = pd.DataFrame(data, columns=["Name", "Date", "Status"])

# 确保日期格式正确并按升序排序
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values('Date').reset_index(drop=True)

# 标记Status为Yes的记录
df['Yes_Flag'] = df['Status'].eq('Yes').astype(int)

# 按姓名分组,计算当前行之前是否有过Yes记录
df['Has_Previous_Yes'] = df.groupby('Name')['Yes_Flag'].cumsum().shift(1) > 0

# 提取符合条件的唯一姓名并统计数量
qualified_names = df[df['Has_Previous_Yes']]['Name'].unique().tolist()
result = f"{len(qualified_names)} ({', '.join(qualified_names)})"

print(result)

代码说明

  1. 数据预处理:将日期转为datetime类型并按升序排序,保证数据顺序符合统计要求
  2. 标记Yes记录:用eq('Yes').astype(int)把Status转为1(Yes)和0(No)的数值标记,简化后续累积计算
  3. 检查历史Yes记录:通过groupby('Name')按姓名分组,用cumsum()累积每个姓名的Yes次数,再用shift(1)获取当前行之前的累积结果,判断是否大于0即可确定该姓名在之前日期是否有过Yes记录
  4. 结果整理:筛选出符合条件的记录,提取唯一姓名后统计数量并格式化输出

运行代码后会输出预期结果:2 (John, Emily)

内容的提问来源于stack exchange,提问作者rainy days.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:30:21