如何按ID将多观测值数据重塑为所有可能的无序观测值对?
解决方案
可以通过分组后生成无序组合的方式实现需求,核心利用itertools.combinations生成每组内的两两无序配对(该函数生成的组合是不重复的无序对,正好符合(b,d)和(d,b)视为相同的要求),具体步骤如下:
代码实现
import pandas as pd from itertools import combinations # 原始数据 df = pd.DataFrame({'id':[1,1,1,2,2], 'letter':['a','b','c','b','d'], 'value':[0,0,0,1,1]}) # 定义分组处理函数 def process_group(group): # 生成letter列的所有两两无序组合 letter_pairs = list(combinations(group['letter'], 2)) # 同一id的value一致,取第一个即可 value = group['value'].iloc[0] # 构造当前组的结果DataFrame return pd.DataFrame({ 'id': [group['id'].iloc[0]] * len(letter_pairs), 'letter': letter_pairs, 'value': [value] * len(letter_pairs) }) # 按id分组并应用处理函数,最后合并结果 result_df = df.groupby('id').apply(process_group).reset_index(drop=True) print(result_df)
输出结果
id letter value 0 1 (a, b) 0 1 1 (a, c) 0 2 1 (b, c) 0 3 2 (b, d) 1
补充说明
- 如果不想用元组表示配对,也可以将组合转为字符串(比如
'a-b'),只需要修改letter_pairs的生成逻辑:
这样输出的letter_pairs = ['-'.join(pair) for pair in combinations(group['letter'], 2)]letter列会是'a-b'这类字符串格式。
内容的提问来源于stack exchange,提问作者Slash
相关产品推荐
相关产品推荐

