Pandas按cross_ref分组聚合时soc_term列丢失问题求助
解决Pandas分组聚合后缺失soc_term列的问题
问题背景
原始DataFrame:
meddra_id meddra_label soc cross_ref soc_term 2 10000081 Abdominal pain 10017947 http://snomed.info/id/21522001 Gastrointestinal disorders 3 10017999 Gastrointestinal pain 10017947 http://snomed.info/id/21522001 Gastrointestinal disorders 15 10000340 Abstains from alcohol 10041244 http://snomed.info/id/105542008 Social circumstances 35 10001022 Acute psychosis 10037175 http://snomed.info/id/69322001 Psychiatric disorders 36 10061920 Psychotic disorder 10037175 http://snomed.info/id/69322001 Psychiatric disorders
需求:
- 按
cross_ref列分组 - 聚合
meddra_id、meddra_label、soc和soc_term列的值 - 排除单个
meddra_id关联到同一cross_ref的行
期望输出:
meddra_id meddra_label soc cross_ref soc_term 10000081,10017999 Abdominal pain,Gastrointestinal pain 10017947 http://snomed.info/id/21522001 Gastrointestinal disorders 10001022,10061920 Acute psychosis,Psychotic disorder 10037175 http://snomed.info/id/69322001 Psychiatric disorders
尝试的代码:
df_terms = df.groupby('cross_ref').filter(lambda g: len(g) > 1).drop_duplicates(subset=['meddra_id', 'meddra_label', 'soc', 'soc_term'], keep="first") #aggregate the values df_terms = df_terms.groupby('cross_ref')['meddra_id', 'meddra_label', 'soc', 'soc_term'].agg(' , '.join).reset_index()
问题:聚合后的DataFrame缺失soc_term列。
解决方案
问题出在统一使用' , '.join聚合所有列,对于soc和soc_term这类同一cross_ref分组内值完全相同的列,更适合用first取唯一值,同时明确指定每个列的聚合逻辑,避免列丢失。修正后的代码如下:
# 过滤分组后数量>1的行并去重 df_terms = df.groupby('cross_ref').filter(lambda g: len(g) > 1).drop_duplicates(subset=['meddra_id', 'meddra_label', 'soc', 'soc_term'], keep="first") # 分组聚合,为不同列指定对应聚合方式 df_terms = df_terms.groupby('cross_ref').agg( meddra_id=('meddra_id', ' , '.join), meddra_label=('meddra_label', ' , '.join), soc=('soc', 'first'), soc_term=('soc_term', 'first') ).reset_index() # 调整列顺序匹配期望输出 df_terms = df_terms[['meddra_id', 'meddra_label', 'soc', 'cross_ref', 'soc_term']]
说明
- 针对
meddra_id和meddra_label:同一分组内有多个不同值,用逗号连接 - 针对
soc和soc_term:同一分组内值唯一,用first直接提取即可,既符合数据逻辑也避免聚合时可能的列丢失问题 - 最后调整列顺序,和期望输出完全一致
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

