如何在Pandas pivot_table中添加条件:仅MDD_Y=1时取最小ADMITDATE?
解决pivot_table条件筛选ADMITDATE的问题
嘿,我知道你现在卡在怎么让分组操作只在MDD_Y等于1的时候取最小ADMITDATE的问题上了,咱们一步步来搞定它!
首先得说你为啥会报错:你写的np.min if 'MDD_Y'==1是无效的Python语法,而且这里的'MDD_Y'只是个字符串,根本没法代表分组里的列值——pivot_table的aggfunc参数里没法直接做这种跨列的条件判断,它的函数是作用于整个分组的列数据,没法关联另一列的筛选条件。
那正确的做法是什么呢?其实咱们可以拆成两步处理,或者用自定义聚合函数来实现:
方法一:拆分计算再合并
这种方法逻辑清晰,容易理解和调试:
- 先单独计算每个ID的MDD_Y总和
- 筛选出MDD_Y=1的行,再计算对应ID的最小ADMITDATE
- 把两个结果合并到一起,保留所有ID的信息
代码示例:
# 计算每个ID的MDD_Y总和 mdd_total = vor_merged_to_dad.groupby('ID')['MDD_Y'].sum().reset_index() # 仅筛选MDD_Y=1的行,计算每个ID的最小ADMITDATE min_admit_date = vor_merged_to_dad[vor_merged_to_dad['MDD_Y'] == 1].groupby('ID')['ADMITDATE'].min().reset_index() # 合并两个结果,用left join保留所有ID,没有符合条件的ADMITDATE会显示NaN vor_merged_to_dad_pivot = pd.merge(mdd_total, min_admit_date, on='ID', how='left')
方法二:用自定义聚合函数一次性完成
如果你想在一个groupby操作里搞定所有逻辑,可以写个自定义函数来处理ADMITDATE的筛选规则:
import pandas as pd def get_min_admit_when_mdd1(group): # 提取当前分组里MDD_Y等于1的ADMITDATE数据 valid_dates = group[group['MDD_Y'] == 1]['ADMITDATE'] # 有符合条件的日期就取最小值,否则返回空值(可根据需求替换成其他默认值) return valid_dates.min() if not valid_dates.empty else pd.NA # 用groupby的agg方法同时计算两个指标 vor_merged_to_dad_pivot = vor_merged_to_dad.groupby('ID').agg( MDD_Y=('MDD_Y', 'sum'), # 对MDD_Y求和 ADMITDATE=('ADMITDATE', get_min_admit_when_mdd1) # 按条件取最小日期 ).reset_index()
这两种方法都能满足你的需求:按ID分组后,MDD_Y做求和计算,仅当分组内存在MDD_Y=1的行时,才获取对应的最小ADMITDATE,没有符合条件的行则会显示空值(你可以根据业务需求替换成比如pd.Timestamp('1900-01-01')这类默认值)。
内容的提问来源于stack exchange,提问作者KubiK888
相关产品推荐
相关产品推荐

