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

如何基于配对行合并DataFrame行(用frozenset与groupby.first())

用frozenset和groupby合并配对DataFrame行的方法

输入数据

Id  Col1  Col2  Col3    Comp      Paired_Id
 1   a     NaN   z     Public         A
 2   b     NaN   x     Public         B
 A  NaN     b    z     Hybrid         1
 B  NaN     d    x     Hybrid         2

需求

基于Id和Paired_Id的配对关系(比如行1和行A配对、行2和行B配对),用frozenset作为分组键,结合groupby聚合方法合并行,得到如下结果:

Id  Col1  Col2  Col3    Comp         Paired_Id
1    a    b       z  Public,Hybrid         A
2    b    d       x  Public,Hybrid         B

实现步骤

1. 生成分组标识

用frozenset将每一行的Id和Paired_Id打包成不可变集合——配对的两行(如1和A)会生成完全相同的集合,而frozenset是可哈希类型,能直接作为groupby的分组键。

2. 分组聚合

按生成的分组键分组后,针对不同列做针对性聚合:

  • Id:筛选组内的数字类型Id作为最终Id;
  • Col1/Paired_Id/Col3:直接取组内第一行的有效值(原数字行的这些列本身有值);
  • Col2:取组内非空的第一个值;
  • Comp:合并组内两个字符串值,用逗号分隔。

完整代码

import pandas as pd

# 构造输入DataFrame
df = pd.DataFrame({
    'Id': ['1', '2', 'A', 'B'],
    'Col1': ['a', 'b', pd.NA, pd.NA],
    'Col2': [pd.NA, pd.NA, 'b', 'd'],
    'Col3': ['z', 'x', 'z', 'x'],
    'Comp': ['Public', 'Public', 'Hybrid', 'Hybrid'],
    'Paired_Id': ['A', 'B', '1', '2']
})

# 生成分组键:用frozenset标记配对行
df['group_key'] = df.apply(lambda row: frozenset([row['Id'], row['Paired_Id']]), axis=1)

# 分组聚合得到结果
result = df.groupby('group_key').agg(
    Id=('Id', lambda x: next(val for val in x if val.isdigit())),
    Col1=('Col1', 'first'),
    Col2=('Col2', lambda x: x.dropna().iloc[0]),
    Col3=('Col3', 'first'),
    Comp=('Comp', ','.join),
    Paired_Id=('Paired_Id', 'first')
).reset_index(drop=True)

print(result)

输出结果

Id Col1 Col2 Col3            Comp Paired_Id
0  1    a    b    z  Public,Hybrid         A
1  2    b    d    x  Public,Hybrid         B

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:09:23