如何在Pandas中结合HAVING子句使用GROUP_CONCAT功能?
问题描述
假设我有如下DataFrame:
| name | type |
|---|---|
| John | 1 |
| Joe | 0 |
| Joe | 1 |
| Marcus | 0 |
| John | 2 |
| John | 0 |
如何使用Pandas实现与以下SQL语句相同的结果?
SELECT name, GROUP_CONCAT(type) FROM df GROUP BY name HAVING COUNT(*)>1;
预期结果如下:
| name | type |
|---|---|
| john | 0,1,2 |
| joe | 0,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
相关产品推荐
相关产品推荐

