如何移除NULL值并将同一用户对应的多个日期合并到同一行
移除NULL值并将同一用户多日期合并为一行的解决方案
针对你描述的需求,可根据你使用的工具选择对应方案:
SQL 实现
核心逻辑是先通过窗口函数给每个用户的日期排序,再用分组聚合自动忽略NULL值完成行转列,不需要额外写NULL过滤逻辑:
SELECT user_id, MAX(CASE WHEN date_rank = 1 THEN date_col END) AS date_1, MAX(CASE WHEN date_rank = 2 THEN date_col END) AS date_2, MAX(CASE WHEN date_rank = 3 THEN date_col END) AS date_3 -- 有更多日期就继续加对应行 FROM ( SELECT user_id, date_col, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY date_col) AS date_rank FROM 你的表名 WHERE date_col IS NOT NULL -- 可提前过滤NULL值,也可以省略不写,MAX会自动跳过NULL ) t GROUP BY user_id
如果要把所有日期合并为单个逗号分隔的字段,直接用字符串聚合函数即可:
-- MySQL写法 SELECT user_id, GROUP_CONCAT(date_col ORDER BY date_col SEPARATOR ',') AS all_dates FROM 你的表名 GROUP BY user_id
Pandas 实现
import pandas as pd # 假设你的数据存在df中,字段为user_id、date_col # 先过滤NULL值 df = df.dropna(subset=['date_col']) # 方式1:所有日期合并为列表列 df_merge = df.groupby('user_id')['date_col'].agg(list).reset_index(name='all_dates') # 方式2:拆分为多列(匹配你要的效果图) df_pivot = df.groupby('user_id')['date_col']\ .apply(lambda x: x.reset_index(drop=True))\ .unstack()\ .add_prefix('date_')\ .reset_index()
Excel 实现
如果你使用的是Excel 365/2021及以上版本,用内置函数即可快速实现:
- 先提取所有唯一用户ID:
=UNIQUE(原表用户ID列范围) - 合并所有日期为单个单元格:
=TEXTJOIN(",",TRUE,FILTER(原表日期列,原表用户ID列=当前行用户ID,"")) - 如果要拆分为多列,用
=TOROW(FILTER(原表日期列,原表用户ID列=当前行用户ID,""))会自动横向溢出填充多列
你当前的尝试效果:
目标实现效果:
内容的提问来源于stack exchange,提问作者renan
相关产品推荐
相关产品推荐

