多列重复时合并对应列值至单列问题求助(groupby尝试失败)
问题解决:按多列分组合并去重非空值
现有如下DataFrame,需按Name、Filename、delimetier三列分组,将每组内的good delimeter和bad delimeter列的值合并为逗号分隔的字符串,同时忽略空值与重复值。尝试使用groupby()方法未成功,以下是可行方案:
原始DataFrame
Name| Filename| delimetier| good delimeter| bad delimeter A 123 48 a A A 123 48 A B 123 48 b C C 123 49 c B A 123 48 d D A 123 48 c E B 123 48 d F
期望结果
Name| Filename| delimetier| good delimeter| bad delimeter A 123 48 a, c, d A, D, E B 123 48 b, d C, F C 123 49 c B
解决方案代码
import pandas as pd # 构造原始DataFrame data = { 'Name': ['A', 'A', 'B', 'C', 'A', 'A', 'B'], 'Filename': [123, 123, 123, 123, 123, 123, 123], 'delimetier': [48, 48, 48, 49, 48, 48, 48], 'good delimeter': ['a', '', 'b', 'c', 'd', 'c', 'd'], 'bad delimeter': ['A', 'A', 'C', 'B', 'D', 'E', 'F'] } df = pd.DataFrame(data) # 定义聚合函数:过滤空值、去重后用逗号连接 def aggregate_col(series): # 过滤空字符串,去重,保持结果有序 unique_vals = [val for val in series.unique() if val.strip() != ''] return ', '.join(unique_vals) # 按指定列分组,应用聚合函数到目标列 result_df = df.groupby(['Name', 'Filename', 'delimetier']).agg({ 'good delimeter': aggregate_col, 'bad delimeter': aggregate_col }).reset_index() print(result_df)
代码说明
- 自定义的
aggregate_col函数会先对分组后的列值去重,过滤掉空字符串,再用逗号连接成字符串 - 使用
groupby按Name、Filename、delimetier分组,对good delimeter和bad delimeter分别应用聚合函数 - 最后用
reset_index()将分组后的索引转为普通列,得到和期望结果一致的结构
内容的提问来源于stack exchange,提问作者huo shankou
相关产品推荐
相关产品推荐

