如何基于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)
代码说明
- 数据预处理:将日期转为
datetime类型并按升序排序,保证数据顺序符合统计要求 - 标记Yes记录:用
eq('Yes').astype(int)把Status转为1(Yes)和0(No)的数值标记,简化后续累积计算 - 检查历史Yes记录:通过
groupby('Name')按姓名分组,用cumsum()累积每个姓名的Yes次数,再用shift(1)获取当前行之前的累积结果,判断是否大于0即可确定该姓名在之前日期是否有过Yes记录 - 结果整理:筛选出符合条件的记录,提取唯一姓名后统计数量并格式化输出
运行代码后会输出预期结果:2 (John, Emily)
内容的提问来源于stack exchange,提问作者rainy days.
相关产品推荐
相关产品推荐

