Pandas按客户id分组并保留非空支付日期的实现方法
你之前的方法失效有两个原因:一是语法顺序错误,正确的分组写法是df.groupby('id')而非groupby.df['id'];二是sum()是数值求和运算,不适用于日期类型的合并,你需要的是取每个id分组下的非空日期值,而非对值求和。
方案1:先转标准日期格式(推荐)
提前把字符串日期转成pandas的日期格式,占位的0会自动转为空日期,后续处理更方便:
import pandas as pd # 转换日期格式,原数据里的0会自动识别为无效值转为空日期NaT df['first_payment'] = pd.to_datetime(df['first_payment'], format='%d/%m/%Y', errors='coerce') df['last_payment'] = pd.to_datetime(df['last_payment'], format='%d/%m/%Y', errors='coerce') # 按id分组,每组自动取非空的日期值 result = df.groupby('id', as_index=False).max()
方案2:不转日期直接处理
如果不需要保留日期类型,只想保留原字符串格式的日期,可以直接替换0为空值后聚合:
import pandas as pd # 把两列的占位0替换为空值(如果你的0是数值类型就去掉引号写0即可) df[['first_payment', 'last_payment']] = df[['first_payment', 'last_payment']].replace('0', pd.NA) # 按id分组聚合 result = df.groupby('id', as_index=False).agg( first_payment=('first_payment', 'max'), last_payment=('last_payment', 'max') )
两种方案得到的结果都和你需要的输出格式一致。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

