如何基于配对行合并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
相关产品推荐
相关产品推荐

