Python按ID聚合多字符串列:保留非normal值或默认normal
嘿,这个聚合需求不难实现,我给你分享两种实用的方法,都能完美达到你的预期效果:
首先先把你的示例数据再贴一遍方便参考:
import pandas as pd d = pd.DataFrame({ 'id': [1, 1, 1, 2, 2, 3], 'col1': ['normal', 'well', 'normal', 'normal', 'well', 'normal'], 'col2': ['bad', 'normal','normal', 'normal', 'normal', 'bad'] })
方法1:自定义聚合函数(可读性高)
先写一个小函数来处理每一列的逻辑:筛选非normal的值,有就保留,没有就返回normal,然后结合groupby和agg来用:
def pick_non_normal(series): # 筛选出当前分组里非normal的所有值 non_normal_vals = series[series != 'normal'] # 有非normal值就取第一个(适配你示例里每个分组仅一个非normal的情况) # 如果有多个非normal值,你可以改成比如','.join(non_normal_vals)来合并 return non_normal_vals.iloc[0] if len(non_normal_vals) > 0 else 'normal' result = d.groupby('id').agg(pick_non_normal).reset_index()
方法2:Lambda简写(更紧凑)
如果不想单独定义函数,直接用lambda表达式写在agg里,逻辑是一样的:
result = d.groupby('id').agg( lambda x: x[x != 'normal'].iloc[0] if len(x[x != 'normal']) > 0 else 'normal' ).reset_index()
运行后得到的result完全符合你的预期:
id col1 col2 0 1 well bad 1 2 well normal 2 3 normal bad
补充一句:如果你的数据里存在某个id下某列有多个非normal值的情况,只需要把函数里的iloc[0]改成你想要的处理方式就行,比如合并成字符串或者取最后一个,灵活调整~
内容的提问来源于stack exchange,提问作者John Snow
相关产品推荐
相关产品推荐

