求助:基于sheet_internal_id列值对Pandas数据分组未达预期
问题
我手里的CSV数据是这种结构:同一个sheet_internal_id对应多条记录,nct_id值完全相同,stat_design有多个不同条目。我需要按sheet_internal_id分组,把同一组的stat_design用逗号拼起来,最终每个sheet_internal_id只保留一行,包含对应的nct_id和拼接后的stat_design。
我试了这段代码,没得到想要的结果:
df_1 = df.fillna('').groupby(['sheet_internal_id','nct_id'])['stat_design'].apply(','.join).reset_index()
解决办法
你这段代码的问题是分组时同时指定了sheet_internal_id和nct_id两个字段,其实只要按sheet_internal_id单字段分组,同时对nct_id取唯一值、对stat_design做拼接就行,给你两种可行写法:
写法一:一次性聚合多字段
直接用agg()方法,对不同字段指定不同的聚合逻辑,简单直接:
df_1 = df.fillna('').groupby('sheet_internal_id').agg( nct_id=('nct_id', 'first'), # 同一组nct_id相同,取第一个值就行 stat_design=('stat_design', ','.join) ).reset_index()
写法二:先统一nct_id再分组
如果担心同一sheet_internal_id下nct_id有不一致的情况(比如空格、大小写差异),可以先把每组的nct_id统一成同一个值,再分组拼接:
# 把同一sheet_internal_id下的nct_id统一为第一个值 df['nct_id'] = df.groupby('sheet_internal_id')['nct_id'].transform('first') # 再分组拼接stat_design df_1 = df.fillna('').groupby(['sheet_internal_id','nct_id'])['stat_design'].apply(','.join).reset_index()
补充说明
如果同一sheet_internal_id下的nct_id本来就完全一致,原代码理论上应该能得到正确结果,但如果nct_id存在隐形差异(比如前后空格),就会被分成不同组,导致结果不符合预期。用单字段分组+聚合的方式能避免这种问题。
内容的提问来源于stack exchange,提问作者Sourabh Raj
相关产品推荐
相关产品推荐

