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
相关产品推荐
相关产品推荐

