You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:10:11