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

如何在Pandas中结合HAVING子句使用GROUP_CONCAT功能?

问题描述

假设我有如下DataFrame:

nametype
John1
Joe0
Joe1
Marcus0
John2
John0

如何使用Pandas实现与以下SQL语句相同的结果?

SELECT name, GROUP_CONCAT(type)
FROM df
GROUP BY name
HAVING COUNT(*)>1;

预期结果如下:

nametype
john0,1,2
joe0,1

Pandas实现方法

要实现对应SQL的逻辑,我们可以通过分组、聚合、过滤的步骤完成,具体代码如下:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'name': ['John', 'Joe', 'Joe', 'Marcus', 'John', 'John'],
    'type': [1, 0, 1, 0, 2, 0]
})

# 实现分组拼接+过滤逻辑
result = (
    df.groupby('name', as_index=False)
      # 聚合:拼接type为逗号分隔的字符串,同时统计每组数量
      .agg(
          type=('type', lambda x: ','.join(map(str, sorted(x)))),
          group_count=('name', 'count')
      )
      # 过滤出组内数量大于1的记录,对应SQL的HAVING子句
      .query('group_count > 1')
      # 移除临时计数列
      .drop('group_count', axis=1)
      # 将name列转为小写,匹配预期结果格式
      .assign(name=lambda x: x['name'].str.lower())
)

print(result)

关键步骤说明:

  • groupby('name', as_index=False):按name字段分组,确保结果以普通列形式返回而非索引
  • agg方法里的两个操作:
    • 对type列,先排序(匹配预期结果的顺序),再转为字符串并用逗号拼接,对应SQL的GROUP_CONCAT
    • 统计每组的行数,用于后续过滤
  • .query('group_count > 1'):直接筛选出组内记录数大于1的分组,等价于SQL的HAVING COUNT(*)>1
  • .assign(name=...):把name列转为小写,和预期结果的格式一致

运行代码后得到的结果和预期完全一致:

name    type
0  john  0,1,2
1   joe    0,1

内容的提问来源于stack exchange,提问作者NicholasHenrique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:05:35