对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)
最终结果
两种方法都会得到如下结果:
| ID | date1 | date2 | date3 | unique_dates_count |
|---|---|---|---|---|
| 0 | 2020-12-01 | 2015-04-01 | NaN | 2 |
| 1 | 2020-12-01 | 2015-04-01 | 2013-12-01 | 3 |
| 2 | NaN | 2018-12-01 | 2018-12-01 | 1 |
| 3 | 2018-12-01 | 2018-12-01 | 2018-12-01 | 1 |
| 4 | NaN | NaN | NaN | 0 |
说明
你之前尝试的groupby.agg()在这里没必要,因为每个ID对应单独一行数据,不需要分组聚合,直接逐行处理更高效。如果硬要用groupby,也可以实现,但属于绕路:
df['unique_dates_count'] = df.groupby('ID')[date_columns].agg(lambda x: x.nunique(dropna=True))
但这种方式本质和逐行处理完全一致,没有优势。
内容的提问来源于stack exchange,提问作者Ayan
相关产品推荐
相关产品推荐

