如何用Pandas按id分组生成同列值的两两组合DataFrame?
同一ID下文本两两组合的实现方案
方法一:分组结合组合生成器
利用groupby按ID拆分数据,再通过itertools.combinations生成每个分组内的两两不重复组合:
import pandas as pd from itertools import combinations # 原始数据 df = pd.DataFrame({ 'id': [1, 1, 1, 2, 2], 'txt': ['A1', 'A2', 'A3', 'A4', 'A5'] }) def process_group(group): # 生成txt列的两两组合 combos = combinations(group['txt'], 2) # 转换为DataFrame并绑定当前ID return pd.DataFrame(combos, columns=['txt', 'txt2']).assign(id=group['id'].iloc[0]) # 分组处理后合并结果 result = df.groupby('id').apply(process_group).reset_index(drop=True)
执行后得到的result即为期望的DataFrame:
id txt txt2 0 1 A1 A2 1 1 A1 A3 2 1 A2 A3 3 2 A4 A5
方法二:自连接加过滤
通过同表自连接实现分组内的笛卡尔积,再过滤掉重复组合:
import pandas as pd df = pd.DataFrame({ 'id': [1, 1, 1, 2, 2], 'txt': ['A1', 'A2', 'A3', 'A4', 'A5'] }) # 按ID自连接,生成所有可能的配对 merged_df = df.merge(df, on='id', suffixes=('', '2')) # 过滤掉重复组合(保留txt < txt2的情况,避免A2&A1这类重复项) result = merged_df[merged_df['txt'] < merged_df['txt2']].reset_index(drop=True)
这个方法无需额外导入库,仅用Pandas原生操作即可实现需求。
内容的提问来源于stack exchange,提问作者Skymli
相关产品推荐
相关产品推荐

