如何分组DataFrame并合并指定列的不同值,按需返回空DataFrame?
分组合并指定列的解决方案
需求回顾
- 按除倒数第二列外的所有列分组,将同一组内的倒数第二列值合并到一行
- 若整个DataFrame中
column_1与last_column的取值完全统一(即所有行的column_1相同、所有行的last_column也相同),直接返回空DataFrame - 仅保留分组后行数≥2的结果组
完整代码实现
import pandas as pd data = {'column_1': ['no', 'no', 'no', 'no'], 'column_2': ['spain', 'france', 'italy', 'germany'], "last_column": ['A', 'A', 'A', 'B']} df = pd.DataFrame.from_dict(data) # 先判断是否需要直接返回空DataFrame if df['column_1'].nunique() == 1 and df['last_column'].nunique() == 1: result = pd.DataFrame() else: # 确定分组列:排除倒数第二列 group_cols = df.columns.drop(df.columns[-2]) # 分组聚合+过滤有效组 result = df.groupby(group_cols, as_index=False).agg( column_2=('column_2', ', '.join), # 合并column_2的值 group_size=('column_2', 'size') # 统计每组行数 ).query('group_size >= 2').drop(columns='group_size') print(result)
代码说明
- 特殊情况判断:用
nunique()检查column_1和last_column是否全表只有唯一值,是则直接返回空DataFrame - 分组列确定:通过
df.columns[-2]定位倒数第二列,从所有列中排除它得到分组依据 - 聚合与过滤:
- 对
column_2使用', '.join合并同组内的所有值 - 用
size统计每组行数,仅保留行数≥2的组(避免单一行的组被保留) - 最后删除用于过滤的统计列,得到目标结果
- 对
测试结果
- 示例数据运行后,会得到
column_1为no、last_column为A、column_2为spain, france, italy的一行结果 - 若将示例数据的
last_column全改为A,则会返回空DataFrame
内容的提问来源于stack exchange,提问作者Tonino Fernandez
相关产品推荐
相关产品推荐

