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

Pandas中Grouper()与agg()分组聚合时重复值冗余问题及优化需求

解决Pandas分组聚合时重复值重复拼接的问题

我懂你的问题所在——当你按ID和日期分组聚合时,原本重复的非空值被反复拼接,导致出现像'xxxx'或者'174.0174.0'这种冗余内容。这是因为你之前用的lambda x: ''.join(x.dropna().astype(str))没有先对分组内的值做去重处理,直接把所有非空值都串起来了。

解决方案思路

我们需要在聚合时先对分组内的非空值去重,再根据数据类型做针对性处理:

  • 对于数值类列:去重后直接保留唯一值(同一分组内的有效数值应该是同一个)
  • 对于字符串类列:去重后如果有多个不同值,用分隔符拼接;如果只有唯一值,直接保留该值

修改后的完整代码

import pandas as pd
import numpy as np

NaN = np.nan
data = {'ID':['A', 'A', 'A', 'B','B','B'], 
        'Date':['2021-09-20 04:34:57', '2021-09-20 04:37:25', '2021-09-20 04:38:26', 
                '2021-09-01 00:12:29','2021-09-01 11:20:58','2021-09-02 09:20:58'], 
        'Name':['xx','xx',NaN,'yy',NaN,NaN], 
        'Height':[174,174,NaN,160,NaN,NaN], 
        'Weight':[74,NaN,NaN,58,NaN,NaN], 
        'Gender':[NaN,'Male',NaN,NaN,'Female',NaN], 
        'Interests':[NaN,NaN,'Hiking,Sports',NaN,NaN,'Singing']}
df1 = pd.DataFrame(data)

# 转换日期为时间戳格式
df1['Date'] = pd.to_datetime(df1['Date'])

# 自定义聚合函数:先去重非空值,再按类型处理
def agg_unique(x):
    # 提取分组内非空的唯一值
    unique_vals = x.dropna().unique()
    if len(unique_vals) == 0:
        return np.nan
    # 数值类型直接返回唯一值
    if pd.api.types.is_numeric_dtype(x):
        return unique_vals[0]
    # 字符串类型:多值用逗号拼接,单值直接返回
    else:
        return ','.join(unique_vals.astype(str))

# 执行分组聚合
df_out = df1.groupby(['ID', pd.Grouper(key='Date', freq='D')]).agg(agg_unique).reset_index()
print(df_out)

最终输出结果

运行代码后会得到完全符合需求的结果:

ID       Date Name  Height  Weight  Gender      Interests
0  A 2021-09-20   xx  174.0    74.0    Male  Hiking,Sports
1  B 2021-09-01   yy  160.0    58.0  Female            NaN
2  B 2021-09-02  NaN    NaN     NaN     NaN         Singing

这样每个分组内的重复值只会保留一次,数值类列不会出现拼接后的冗余内容,字符串类列如果有多个不同值也会清晰分隔展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:47:52