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

对DataFrame每行应用函数计算多列唯一日期数量

解决方法

原数据构造

import pandas as pd
import numpy as np

df = pd.DataFrame({'ID':[0,1,2,3,4],
                   'date1': ['2020-12-01','2020-12-01',np.nan,'2018-12-01',np.nan],
                   'date2': ['2015-04-01','2015-04-01','2018-12-01','2018-12-01',np.nan],
                   'date3': [np.nan,'2013-12-01','2018-12-01','2018-12-01',np.nan]
})

方法一:逐行应用nunique(最直接)

直接针对每行的日期列,排除空值后计算唯一值数量:

# 指定日期列
date_columns = ['date1', 'date2', 'date3']
# 逐行计算唯一日期数,dropna=True忽略NaN
df['unique_dates_count'] = df[date_columns].apply(lambda row: row.nunique(dropna=True), axis=1)

方法二:通过stack重塑后分组计数

适合需要对日期做额外处理的场景:

# 以ID为索引,取出日期列并重塑为长格式
temp_df = df.set_index('ID')[date_columns].stack().reset_index(name='date')
# 按ID分组统计唯一日期数
count_result = temp_df.groupby('ID')['date'].nunique().reset_index(name='unique_dates_count')
# 合并回原DataFrame,空值填充为0
final_df = df.merge(count_result, on='ID', how='left').fillna({'unique_dates_count': 0})
# 转换为整数类型
final_df['unique_dates_count'] = final_df['unique_dates_count'].astype(int)

最终结果

两种方法都会得到如下结果:

IDdate1date2date3unique_dates_count
02020-12-012015-04-01NaN2
12020-12-012015-04-012013-12-013
2NaN2018-12-012018-12-011
32018-12-012018-12-012018-12-011
4NaNNaNNaN0

说明

你之前尝试的groupby.agg()在这里没必要,因为每个ID对应单独一行数据,不需要分组聚合,直接逐行处理更高效。如果硬要用groupby,也可以实现,但属于绕路:

df['unique_dates_count'] = df.groupby('ID')[date_columns].agg(lambda x: x.nunique(dropna=True))

但这种方式本质和逐行处理完全一致,没有优势。

内容的提问来源于stack exchange,提问作者Ayan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:25:22