如何在Pandas GroupBy聚合时排除NaN值进行拼接?
解决分组聚合时跳过NaN值的问题
我来帮你搞定这个需求!你现在需要在分组聚合拼接字符串的时候,自动跳过NaN值,而不是把它们转成nan字符串拼进去对吧?下面给你两种可行的实现方式:
方法一:自定义聚合函数(可读性更高)
先写一个专门处理非NaN值拼接的函数,逻辑清晰,后续维护也方便:
import pandas as pd import numpy as np # 自定义聚合函数:过滤NaN后拼接,无有效值则返回NaN def join_without_nan(x): # 过滤掉当前组中的所有NaN值,同时转成字符串类型 valid_values = x.dropna().astype(str) # 如果过滤后没有有效内容,返回NaN;否则用分号拼接 return ';'.join(valid_values) if len(valid_values) > 0 else pd.NA # 应用分组聚合 result = df.groupby(['t1'], as_index=False).agg(join_without_nan)
运行后得到的结果就是你想要的:
t1 c1 c2 0 20 NaN xyz;x1y1z1
方法二:简洁的Lambda写法
如果想要更紧凑的代码,可以把逻辑直接写到lambda里:
result = df.groupby(['t1'], as_index=False).agg( lambda x: ';'.join(x.dropna().astype(str)) if not x.dropna().empty else pd.NA )
原理说明
原来的代码之所以会把NaN转成nan字符串拼接,是因为直接用x.astype(str)把所有值(包括NaN)都转成了字符串。现在通过x.dropna()先过滤掉NaN值,只对有效内容进行拼接,完美解决了你的问题~
内容的提问来源于stack exchange,提问作者Bharat Sharma
相关产品推荐
相关产品推荐

