如何基于Pandas DataFrame为相同标签生成匹配及不匹配的定义对
实现思路
- 按
label字段分组处理,避免不同标签的定义交叉生成无效配对 - 对每个标签分组,生成组内所有
def1和def2的笛卡尔积配对 - 对每一组配对,判断是否和原始行的匹配关系一致,对应设置
match值为1或0,同时保留原始行的Id和label字段
完整可运行代码
import pandas as pd from itertools import product # 输入数据,可替换为你读取CSV得到的DataFrame df = pd.DataFrame( data=[['q54', 'apple', 'fruit apple', 'fruit'], ['q55', 'apple', 'inc', 'apple inc']], columns=['Id', 'label', 'def1', 'def2'] ) result = [] # 按标签分组处理 for label, group in df.groupby('label'): original_rows = group.to_dict('records') def1_list = group['def1'].tolist() def2_list = group['def2'].tolist() # 生成组内所有def1和def2的配对 for def1, def2 in product(def1_list, def2_list): # 匹配当前def1对应的原始行,获取Id match_row = next(row for row in original_rows if row['def1'] == def1) # 判断是否为原始匹配对 match_val = 1 if match_row['def2'] == def2 else 0 result.append({ 'Id': match_row['Id'], 'label': label, 'def1': def1, 'def2': def2, 'match': match_val }) # 生成最终DataFrame result_df = pd.DataFrame(result) print(result_df)
输出结果
针对你提供的测试数据,运行后输出如下:
Id label def1 def2 match 0 q54 apple fruit apple fruit 1 1 q54 apple fruit apple apple inc 0 2 q55 apple inc fruit 0 3 q55 apple inc apple inc 1
如果你替换输入为你问题开头的3行Apple样本数据,代码无需修改即可生成符合要求的输出。
内容的提问来源于stack exchange,提问作者Mai
相关产品推荐
相关产品推荐

